혹시 틀린 부분이 있다면 지적해주시면 감사하겠습니다 :)
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번만 전달하고 싶다? 이럴 때 사용하면 유용함
'🍎 iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Disposable, Dispose, DisposeBag (0) | 2023.03.16 |
---|---|
[RxSwift] RxSwift + MVVM + Moya 적용 (feat. tableview binding) (0) | 2023.01.19 |
[RxSwift] 곰튀김 RxSwift + MVVM 정리 (0) | 2023.01.16 |