什么是 Scheduler ?
Scheduler 就是一個程序上下文發(fā)生的地方,它可以是一個線程,一個 dispatch queue 或者 NSOperation,例如下面的圖片所示:

image.png
闡明 Scheduler
有一個錯誤的觀點就是 schedulers 等價于一個 thread,這樣看起來好像很合理,schedulers 就像 GCD.
但是如果以自定義 scheduler 的時候,可以創(chuàng)建多個 scheduler 使用相同的線程

explicit
這里要記住的是 schedulers 并不是線程,它也沒有和線程有一一對應的關(guān)系
下面是例子用到的一些代碼
fileprivate func secondsElapsed() -> String {
return String(format: "%02i", Int(Date().timeIntervalSince(start).rounded()))
}
extension ObservableType {
func dump() -> RxSwift.Observable<Self.E> {
return self.do(onNext: { element in
let threadName = getThreadName()
print("\(secondsElapsed())s | [D] \(element) received on \(threadName)")
})
}
func dumpingSubscription() -> Disposable {
return self.subscribe(onNext: { element in
let threadName = getThreadName()
print("\(secondsElapsed())s | [S] \(element) received on \(threadName)")
})
}
}
接下來寫下如下代碼
let fruit = Observable<String>.create { (observer) -> Disposable in
observer.onNext("[apple]")
sleep(2)
observer.onNext("[pineapple]")
sleep(2)
observer.onNext("[strawberryy]")
return Disposables.create()
}
輸入如下
00s | [D] [apple] received on Main Thread
00s | [S] [apple] received on Main Thread
02s | [D] [pineapple] received on Main Thread
02s | [S] [pineapple] received on Main Thread
04s | [D] [strawberryy] received on Main Thread
04s | [S] [strawberryy] received on Main Thread
使用 subscribeOn
有時候要改變 schedule 的 observable 的運行的地方。創(chuàng)建一個 scheduler,然后改成如下代碼
let globalScheduler = ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global())
fruit
.subscribeOn(globalScheduler)
.dump()
.dumpingSubscription()
.addDisposableTo(bag)
RunLoop.main.run(until: Date(timeIntervalSinceNow: 13))
輸出如下
00s | [D] [apple] received on Anonymous Thread
00s | [S] [apple] received on Anonymous Thread
02s | [D] [pineapple] received on Anonymous Thread
02s | [S] [pineapple] received on Anonymous Thread
04s | [D] [strawberryy] received on Anonymous Thread
04s | [S] [strawberryy] received on Anonymous Thread
使用 observeOn
把代碼改成如下:
fruit
.subscribeOn(globalScheduler)
.dump()
.observeOn(MainScheduler.instance)
.dumpingSubscription()
.addDisposableTo(bag)
輸出:
00s | [D] [apple] received on Anonymous Thread
00s | [S] [apple] received on Main Thread
02s | [D] [pineapple] received on Anonymous Thread
02s | [S] [pineapple] received on Main Thread
04s | [D] [strawberryy] received on Anonymous Thread
04s | [S] [strawberryy] received on Main Thread