🍎 iOS/RxSwift

[RxSwift, RxCocoa] 주요 Operator 특징 및 차이점 정리 (계속 업데이트 예정)

dev_zoe 2023. 3. 16. 22:27
반응형

혹시 틀린 부분이 있다면 지적해주시면 감사하겠습니다 :)

 

1. map vs flatMap vs compactMap

https://limjs-dev.tistory.com/139

https://huniroom.tistory.com/entry/RxSwift-Transforming-Operator-toArray-map-compactMap

 

공통점 :  모두 Observable을 특정 로직을 적용하여 데이터를 바꾼다.

차이점 :

- map은 변환 아이템을 Observable로 바꿔 return해주고,

- flatMap은 단순히 Observable로 바꾸는게 아니라 평평하게 하나의 Observable로 바꿔준다.

 

예를들어 map은 Observable<Observable<Observable<APIResult>>> 이렇게 return 해주지만

flatMap은 Observable<APIResult> 이렇게 깔끔하게 Observable을 평면화하여 return 해준다.

 

- compactMap은 map과 거의 유사하지만, map과 달리 result를 옵셔널로 변환하고 만약에 nil값이면 옵저버블을 방출하지 않아, 그 뒤 연산을 실행하지 않는다.

 

2. subscribe vs do

공통점 : do와 subscribe 모두 이벤트가 발생했을 때, 해당 이벤트가 들어오면 next일 때 할일, error일 때 할일, complete 될 때 할일을 처리할 수 있다.

차이점 : 명확한 해답을 얻지는 못했으나, 해당 라이브러리를 까보고 실제 적용해본 결과로는

do : 이벤트를 처리한 다음에, Observable을 다시한번 return 해주니까 추가적으로 이벤트를 처리할 수 있음

subscribe : 이벤트를 처리한 다음에, Disposable을 return 해줌으로써 뒤에 추가적으로 이벤트를 처리할 수 없다!

- 이벤트를 처리한 다음에 추가적으로 이벤트를 처리할 동작이 남았다면 do, 없다면 subscribe를 사용하는 것으로 보인다.

 

3. bind

- 메인스레드에서만 실행되고, Observable과 UI를 결합해주는 역할

observable.bind(to: label.rx.text)

- 이벤트를 특정 로직으로 처리하지 않고 바로 전달할 때에도 사용한다.

        closeSignal
            .subscribe(onNext: { _ in
                dismiss(animated: false)
            })
            .disposed(by: sceneDisposeBag)

            routes.cancel //cancel : PublishSubject<Void>
            .map { SelectTimeModalResult.cancel }
            .bind(to: closeSignal)
            .disposed(by: sceneDisposeBag)

 

4. throttle

- 타이머를 지정해두고 이벤트가 처음 방출되면 타이머 동안 어떤 이벤트도 방출되지 않는다. 

예를들어 사용자가 클릭을 여러번해서 API가 여러번 가는것을 방지하고 싶어서 1초동안의 클릭 이벤트 작동을 멈추고? 싶을때 유용함

.throttle(.seconds(1), scheduler: MainScheduler.instance)

 

5. asObservable()

- Observable이 아닌 값을 Observable로 만들어서 반환해줌

 

6. just

- 값을 하나 방출한다음에 바로 종료

 

7. catch vs catchAndReturn

- catch는 Error가 발생하면 새로운 옵저버블을 리턴

- catchAndReturn은 Error가 발생하면 특정 값을 Next이벤트로 전달

https://huniroom.tistory.com/entry/RxSwift-Error-Handling-catch-catchAndReturn

 

8. take(num)

- 인자로 주어진 num 개수만큼의 이벤트만 방출하고 구독이 종료된다.

- 예를들어 클릭을 딱 한번만 해서 이벤트를 1번만 전달하고 싶다? 이럴 때 사용하면 유용함

반응형