참고 블로그1
참고 블로그2
참고 블로그3
참고 블로그4
StackOverflow
Scheduler란 특정 코드가 실행되는 Context(작업의 메커니즘)를 추상화한 것이다.
Cocoa에서는 Main Queue를 사용하지만 RxSwift에서는 MainScheduler를 사용한다.
SunscribeOn은 시퀀스가 시작할 스케줄러
를 결정한다. 즉 특정 스케줄러에서 동작의 수행을 보장할 때 한번만 실행하는 것을 권장한다.
ObserveOn은 시퀀스를 어느 스케줄러에서 observe할 것인지
를 결정한다. 각각의 Operator(map, filter 등등)을 다른 스케줄러에서 지정하고 싶을 때 사용할 수 있다.
Observable<Int>.of(1,2,3,4,5)
.subscribe(on: CurrentThreadScheduler.instance)
// subscribeOn은 deprecated되었다.
// .subscribeOn(MainScheduler.asyncInstance)
.observe(on: MainScheduler.instance)
.map {
print("main 에서 실행 됨")
print($0)
}
.observe(on: ConcurrentDispatchQueueScheduler.init(qos: .background))
.subscribe({
print("Concurrent background에서 실행됨")
print($0)
})
.disposed(by: disposeBag)
MainThread에서 실행되어야 할 작업에서 사용 (주로 UI)
MainSchedule.instance
vs MainSchedule.asyncInstance
보이는 그대로 MainSchedule.instance
는 synchronous하게, MainSchedule.asyncInstance
는 asynchronous하게 main thread에 이벤트를 전달한다.
MainSchedule.asyncInstance
는 자주 쓰이지 않고, 가능하면 쓰는걸 회피하는 것이 좋다.
하지만 하나의 event가 같은 pipeline
안에서 다른 event를 트리거 할 때 first event가 끝나기 전에 second event가 불린다고 warning이 뜨므로 이런 경우에 사용하면 된다.
현재 있는 쓰레드에서 작업이 실행된다.
만약 CurrentThreadScheduler.instance.schedule(state) { }
를 어떤 스레드에서 처음으로 호출했다면, 그 예정된 행동은 즉시 실행될 것이고 모든 재귀적 예정된 액션들이 임시로 저장되는 숨겨진 큐가 생성될 것입니다.
만약 콜 스택의 몇몇 부모 프레임이 이미 CurrentThreadScheduler.instance.schedule(state) { }
를 실행중이라면, 예정된 액션은 저장되고 현재 실행중인 액션과 모든 전에 저장되었던 액션이 실행 종료되고 나서 실행될 것입니다.
특정한 dispatch_queue_t
에서 실행되어야 할 작업을 처리한다.
메인 스케줄러는 SerialDispatchQueueScheduler
의 인스턴스 중 하나
특정한 dispatch_queue_t
에서 실행되어야 할 작업을 처리한다.
Serial Queue에 작업을 보내도 문제가 생기지 않는다.
보통 백그라운드에서 처리해야 할 때 적합하다.
NSOperationQueue
에서 실행되어야 할 작업을 처리한다.
백그라운드에서 작업을 조정하고 싶을 때 사용하며 maxConcurrentOperationCount
로 작업 조정 가능
RxTest
에 포함되어 있으며 production code에는 사용하지 않음
는 만들 일이 거의 없다고 생각해서 공홈꺼 긁어옴