# [RxSwift] observeOn vs subscribeOn

There are two main operators that work with schedulers, observeOn and subscribeOn.

If you want to perform work on a different scheduler just use observeOn(scheduler) operator.

You would usually use observeOn a lot more often than subscribeOn.

In case observeOn isn't explicitly specified, work will be performed on whichever thread/scheduler elements are generated.

If you want to perform work on a different scheduler just use observeOn(scheduler)operator.

If you want to start sequence generation (subscribe method) and call dispose on a specific scheduler, use subscribeOn(scheduler).

// observeOn과 subscribeOn을 사용한 예제
Observable<Int>.create { observer in
    observer.onNext(1)
    observer.onNext(2)
												
    print("Hi \(Thread.isMainThread)")

    observer.onCompleted()
    return Disposables.create()
}
.observeOn(MainScheduler.instance)
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.subscribe(onNext: { el in	    
    print("onNext \(el) \(Thread.isMainThread)") 
}, onDisposed: {(
    print("dispose \(Thread.isMainThread)")
)})

/*
	onNext 1 true
	onNext 2 true
	Hi false
	dispose true
*/
// 네트워킹으로 받아온 데이터로 background에서 observable을 생성하고
// observable이 방출하는 element들은 main에서 처리하는 코드
// 1. observable을 선언. 아직 subscribe가 되지 않아 생성되진 않은 상태.
let todoObservable: Observable<[String]> = NetworkService.loadTodoList()

todoObservable
  // 2. observable을 background에서 생성.
  .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .default))
  // 3. 이후부터는 main에서 처리하도록 함.
  .observeOn(MainScheduler.instance)
  .subscribe(onNext: { todoList in
      print("Todo: \(todoList)")
  })
  .disposed(by: disposeBag)

# Scheduler

# MainScheduler

  • 메인 쓰레드에서 가장 위에 존재(UI와 high-priority tasks를 진행 ,,, heavy task는 피해야함(API request등)

  • UI를 갱신하려면 이 스케줄러로 변경하여 사용

# SerialDispatchQueueScheduler

  • background에서 추출하는 일을 처리할 때 사용 (Firebase를 사용할 때 서버의 endpoint에 너무 많은 pressured을 줄일 수 있음)

# ConcurrentDispatchQueueScheduler

  • SerialDispatchQueueScheduler와 같이 추출하는 일을 처리할 때 사용, 단 병렬적 (작업량이 많은 일에 사용)

# TestScheduler

  • 테스트를 위한 것이며, production code에는 사용하지 않음

  • RxTeat 라이브러리에 존재

# References

observeOn vs. subscribeOn (opens new window)

[RxSwift] Scheduler 제대로 알아보기 (opens new window)

ReactiveX/RxSwift (opens new window)