김경록의 앱 개발 여정

[RxSwift] RxSwift 본문

TIL

[RxSwift] RxSwift

Kim Roks 2025. 1. 9. 19:06

반응형 프로그래밍

  • 데이터 흐름과 변화의 전파에 중점을 둔 프로그래밍 패러다임
  • 데이터나 이벤트가 변경될 때 이러한 변경 사항이 자동으로 관련된 컴포턴트에 전파되도록 설계된 방식

RxSwift

  • RxSwift는 swift를 위한 반응형 프로그래밍을 구현한 라이브러리
  • 비동기 코드를 보다 간결하고 효율적으로 작성할 수 있게 해줌
  • 우리가 항상 사용하던 escaping 키워드의 생략과 더불어 마치 리턴 값이 있는 함수를 사용하듯 편하게 비동기 코드를 작성 할 수 있는 툴.

공식문서에서

RxSwift의 의도는 관찰 가능한 객체와 이러한 비동기 작업을 변환하고 구성하는 메서드 모음 형태로 비동기 연산과 데이터 스트림을 쉽게 구성할 수 있도록 하는 것입니다.

KVO 관찰, 비동기 작업, UI 이벤트 및 기타 데이터 스트림은 모두 시퀀스 추상화에 따라 통합됩니다. 이것이 바로 Rx가 간단하고 우아하며 강력한 이유입니다.

라고 설명하고 있다.

( RxSwift's intention is to enable easy composition of asynchronous operations and streams of data in the form of Observable objects and a suite of methods to transform and compose these pieces of asynchronous work)

옵저버블

  • 이벤트를 발생시키는 역할
  • 비동기 이벤트를 관찰 가능한 형태로 만든 것
  • 이벤트 발생시 item을 시퀀스로 방출

옵저버

  • 옵저버블이 발생시키는 이벤트에 반응하는 역할
  • Subscribe를 통해 옵저버블* 을 구독해서 이벤트를 받음
public func subscribe(
    onNext: ((Element) -> Void)? = nil,
    onError: ((Swift.Error) -> Void)? = nil,
    onCompleted: (() -> Void)? = nil,
    onDisposed: (() -> Void)? = nil
) -> Disposable

메서드 원형

옵저버블이 방출하는 아이템을 각 상황별로 처리함

해당 메서드로 클로저 넘겨 줄 경우 자체적으로 AnonymousObserver 생성,

해당 옵저버블을 자동으로 구독해준다

이 메서드 원형을 항상 사용하기엔 번거로움이 존재한다. 따라서 많은 sugar API를 제공하는데 아래 링크에서 확인가능하며

ReactiveX - Operators

해당 링크에서 marble 이미지를 참고하면 동작을 이해하기 수월해진다

해당 그림은 자주 쓰이는 just메서드의 마블 이미지로, 생성 된후 complete된다는 걸 알려주고 있다.

또한,

알파벳 순으로 정렬되어있으며, 볼드 처리 된 오퍼레이터가 원형임을 나타낸다.( Buffer가 원형이고, BufferWithCount는 Buffer + @ 인것)

Disposable, dispose()

  • 메모리 릭 방지를 위한 설계를 필요로함
  • 더 이상 구독할 필요가 없는 경우 사용
  • 일반적으로 직접 호출을 권장하지않음
    → DisposeBag,takeUntil을 사용 권장
  • ex) 뷰컨이 없어져도 dispose해주지 않으면 구독은 사라지지않고 계속 일할 수 있음 → 뷰컨이 deinit 될 때 일일이 dispose 해줘야함

DisposaBag

  • ARC같은 역할을 해줌
  • 해제해야줘야 하는 리소스가 많아졌을때의 불편함을 감소시켜줌
  • disposable을 담는 배열
  • disposed(by bag: DisposeBag) 메서드를 통한 배열 사용
  • 내부적으로 Bag자체가 deinit이 되는 순간 dispose를 호출, 각 해당 객체이 생명 주기에 맞춘 리소스의 해제 지원
  • ex) 뷰컨에 DisposeBag을 담아놓으면 뷰컨이 deinit될 때 자동으로 전부 dispose() 됨

Traits

  • 특정 작업을 더 명확하고 간결하게 수행하기 위해 고안된 옵저버블

대표적으로 Single, Maybe, Completable 이 있음

Single

  • 하나의 값 또는 에러를 방출하는 옵저버블
  • 네트워크 요청과 같은 단일 값을 생성하는 작업에 적합
  • success 또는 error를 방출
  • success는 하나의 값과 함께 전달 됨

Maybe

  • Success, Completed, Error 를 방출할 수 있는 옵저버블
  • 싱글과 유사하지만 값 없이 성공적으로 완료될 수 있는 경우에 사용

Completable

  • 작업의 완료 또는 실패만을 알리는 옵저버블
  • 값의 생성 X
  • 파일 작성 또는 데이터 베이스 업데이트와 같은 결과 값을 반환할 필요가 없는 경우

ControlEvent

  • RxCocoa에서 주로 사용됨
  • UIControl Event 를 위한 특별한 옵저버블

특징

  • 메인 스레드에서만 작동, UI업데이트시 스레드 문제를 방지함
  • 에러 이벤트 방출X
  • dispose 처리 필요 없음 → 자동으로 구독 해제 → 메모리 누수 방지

이 외에도 많이 있지만 주요 operator는

1. 생성 (Creating Observables)

just: 단일 요소를 포함하는 Observable 시퀀스를 생성합니다.of: 고정된 수의 요소들을 포함하는 Observable 시퀀스를 생성합니다.

from: 배열, 딕셔너리와 같은 컬렉션 타입을 Observable 시퀀스로 변환합니다.

create: Observable을 수동으로 생성할 때 사용합니다. 이벤트를 커스텀할 수 있습니다.

deferred: Observable을 생성하는 팩토리 함수를 제공하여, Observable이 구독될 때마다 새로운 Observable을 생성합니다.

2. 변형 (Transforming)

map: 각 요소에 함수를 적용하여 결과를 반환합니다.

flatMap: Observable 요소를 다른 Observable로 변환하고, 결과적으로 나오는 Observable들을 하나의 Observable 시퀀스로 병합합니다.

scan: 축적된 결과를 포함하는 Observable을 생성하기 위해 각 요소에 함수를 적용합니다.

3. 필터링 (Filtering)

filter: 조건에 맞는 요소만을 방출합니다.

distinctUntilChanged: 연속적으로 중복된 요소를 제거합니다.

take: 시작부터 지정된 수의 요소만을 방출합니다.

skip: 시작부터 지정된 수의 요소를 건너뜁니다.

4. 결합 (Combining)

merge: 여러 Observable에서 방출된 요소들을 하나의 Observable로 병합합니다.

concat: 여러 Observable을 순서대로 이어 붙여서 하나의 Observable 시퀀스로 만듭니다.

zip: 여러 Observable에서 방출된 요소들을 순서대로 짝지어줍니다.

combineLatest: 여러 Observable 중 하나라도 새로운 요소를 방출할 때마다, 각 Observable의 마지막 요소를 결합하여 방출합니다.

5. 오류 처리 (Error Handling)

catch: 오류가 발생했을 때, 다른 Observable로 대체합니다.

retry: 오류가 발생했을 때, Observable 시퀀스를 재시도합니다.

 

자세한 내용은 공식문서 참조

참조: ReactiveX - Operators