二十十兢、調度器(Schedulers)
1,基本介紹
(1)調度器(Schedulers
)是 RxSwift
實現多線程的核心模塊摇庙,它主要用于控制任務在哪個線程或隊列運行旱物。
(2)RxSwift
內置了如下幾種 Scheduler
:
-
CurrentThreadScheduler:表示當前線程
Scheduler
。(默認使用這個) -
MainScheduler:表示主線程卫袒。如果我們需要執(zhí)行一些和
UI
相關的任務宵呛,就需要切換到該Scheduler
運行。 -
SerialDispatchQueueScheduler:封裝了
GCD
的串行隊列夕凝。如果我們需要執(zhí)行一些串行任務宝穗,可以切換到這個Scheduler
運行户秤。 -
ConcurrentDispatchQueueScheduler:封裝了
GCD
的并行隊列。如果我們需要執(zhí)行一些并發(fā)任務逮矛,可以切換到這個Scheduler
運行鸡号。 -
OperationQueueScheduler:封裝了
NSOperationQueue
。
2须鼎,使用樣例
? ? ? ? 這里以請求網絡數據并顯示為例鲸伴。我們在后臺發(fā)起網絡請求,然后解析數據晋控,最后在主線程刷新頁面汞窗。
過去我們使用 GCD
來實現,代碼大概是這樣的:
//現在后臺獲取數據
DispatchQueue.global(qos: .userInitiated).async {
let data = try? Data(contentsOf: url)
//再到主線程顯示結果
DispatchQueue.main.async {
self.data = data
}
}
如果使用 RxSwift
來實現糖荒,代碼大概是這樣的:
let rxData: Observable<Data> = ...
rxData
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated)) //后臺構建序列
.observeOn(MainScheduler.instance) //主線程監(jiān)聽并處理序列結果
.subscribe(onNext: { [weak self] data in
self?.data = data
})
.disposed(by: disposeBag)
3杉辙,subscribeOn 與 observeOn 區(qū)別
(1)subscribeOn()
- 該方法決定數據序列的構建函數在哪個
Scheduler
上運行模捂。 - 比如上面樣例捶朵,由于獲取數據、解析數據需要花費一段時間的時間狂男,所以通過
subscribeOn
將其切換到后臺Scheduler
來執(zhí)行综看。這樣可以避免主線程被阻塞。
(2)observeOn()
- 該方法決定在哪個
Scheduler
上監(jiān)聽這個數據序列岖食。 - 比如上面樣例红碑,我們獲取并解析完畢數據后又通過
observeOn
方法切換到主線程來監(jiān)聽并且處理結果。