-
[RxSwift] share, subscribe vs bind vs drive, Scheduler, observeOn, subscribeOn🧃RxSwift 2022. 10. 27. 19:42
Share
- 일반적으로 subscribe(bind)를 할 때마다 새로운 시퀀스가 생성이 됨!
- 따라서 여러 subscribe를 하게 될 경우 불필요한 리소스가 발생할 수 있기 때문에 내부적으로 모든 subscribe가 하나의 subscribe를 공유할 수 있게 해주는 것!
- share의 파라미터인 replay와 scope를 통해 버퍼 사이즈와 유지 상태를 결정할 수 있음!
- ex) share()가 구현되어있지 않다면 네트워크 요청이 여러 번 일어나게 되기 때문에 불 필요한 콜이나 리소스 낭비가 생기기 때문에 share()로 해결 가능!
Subscribe vs Bind vs Drive
subscribe
- 에러 처리 가능
- 쓰레드 지정 가능
💡 일반적 상황, 즉 에러처리, 쓰레드 지정해야하는 경우 등 다양한 상황에서 사용함!
bind
- 에러 처리 불가
- 사실상 onNext만 구현한 subscribe
- Main Thread에서의 실행을 보장
- UI에 특화된 형태
💡 에러처리를 따로 안하므로 주로 error가 없는 button.rx.tap 같은 UX subscribe 용으로 많이 사용함!
drive
- 에러 처리 불가
- Main Thread에서의 실행을 보장
- Stream 공유가 됨!
- UI에 특화된 형태
- 내부적으로 share(replay: 1, scope: .whileConnected) 가 구현되어 있음!
💡 메인스레드에서 실행된다는 보장이 있기 때문에 주로 백그라운드 작업 후 UI에 적용되어야 할 때 사용됨!
Scheduler
- iOS의 GCD와 유사하며, Thread 관리를 하기 위해 Scheduler를 사용함!
- serial scheduler를 사용한다면, Rx는 직렬적으로 진행
- cuncurrent scheduler를 사용한다면, Rx는 동시에 진행
1) MainScheduler
- 메인 쓰레드에서 가장 위에 존재(UI와 high-priority tasks를 진행 ,,, heavy task는 피해야함(API request등)
- UI를 갱신하려면 이 스케줄러로 변경하여 사용
2) SerialDispatchQueueScheduler
- background에서 추출하는 일을 처리할 때 사용 (Firebase를 사용할 때 서버의 endpoint에 너무 많은 pressured을 줄일 수 있음)
3) ConcurrentDispatchQueueScheduler
- SerialDispatchQueueScheduler와 같이 추출하는 일을 처리할 때 사용, 단 병렬적(작업량이 많은 일에 사용)
4) TestScheduler
- 테스트를 위한 것이며, production code에는 사용하지 않음
- RxTeat 라이브러리에 존재
연산자
observeOn
- observable이 observer에게 다른 Thread로 동작하게 변경해줌!
- observeOn 이후에 오는 연산자에 대한 Scheduler를 지정하게 됨!
- observeOn을 특정 작업이나 연산에 Scheduler를 변경할 수 있어 여러 번 사용할 수 있음!
- observer(on: MainScheduler.instance) - Main Thread로 변경
subscribeOn
- Observable이 시작이 되는 Scheduler를 지정함!
- subscribeOn은 Obervable이 동작하는 Scheduler를 변경하는 것이기 때문에 한번만 사용하는 게 좋음!
'🧃RxSwift' 카테고리의 다른 글
[RxSwift] subscribe, traits, bind, drive, relay, Subject와 Relay의 차이점 (0) 2022.10.27 [RxSwift] Disposable, withUnretained, debounce, Subject 기본 개념 (0) 2022.10.25 [RxSwift] RxSwift 맛보기 (0) 2022.10.25