MainScheudler
DispatchQueue.main
에서 수행되어야 하는 작업의 추상화이다.
schedule
methods는 DispatchQueue.main
에서 호출되어지며, 스케쥴링 없이 즉각적으로 수행한다.
- Main Sehcudler는
SerialDispatchQueueScheduler
이다.
- UI 작업의 수행이 일반적으로 사용된다.
observeOn
연산자에 최적화되어 있다.
subscribeOn
을 사용하여 메인 스레드에서 observable을 구독하도록 하려면 ConcurrentMainScheduler
가 해당 목적에 더욱 최적화되어 있으므로 ConcurrentMainScheduler
를 사용하도록 한다.
asyncInstance
- 항상 비동기식으로 작업을 예약하고 기본 대기열에서 예약된 호출에 대해 최적화를 수행하지 않는다.
asyncInstance
는 Event의 async 전달을 보장하지만, instance
는 이미 MainThread에 있을 경우 event를 sync하게 전달한다.
- 이미 Main thread에 있을 때 async 전달을 강제해야 하는 이유는 아래와 같다.
- 동일한 파이프라인에서 하나의 이벤트가 새로운 이벤트의 전달을 트리거하는 재귀 반응 파이프라인이 존재한다.
- 만일 이러한 이벤트가 sync하게 발생하면 Rx contract가 깨지고 RxSwift는 첫 번째 이벤트가 완료되기 이전에 두번째 이벤트를 전달하려고 시도햇다는 경고를 내보내게 된다.
- 이 경우,
MainScheduler.asyncInstance
에서 주기를 깨는 것을 관찰할 수 있다.
https://stackoverflow.com/questions/58332584/rxswift-mainscheduler-instance-vs-mainscheduler-asyncinstance