[RxSwift] 8.`MainScheduler.instance` vs `MainScheduler.asyncInstance`

DEV-YONG·2022년 1월 9일
0

RxSwift

목록 보기
8/8

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

profile
🧑🏻‍💻 iOS Developer @TOSS

0개의 댓글