Schedulers - 調(diào)度器

image.png

Schedulers 是 Rx 實現(xiàn)多線程的核心模塊,它主要用于控制任務(wù)在哪個線程或隊列運行。

例如GCD用法:

// 后臺取得數(shù)據(jù),主線程處理結(jié)果
DispatchQueue.global(qos: .userInitiated).async {
    let data = try? Data(contentsOf: url)
    DispatchQueue.main.async {
        self.data = data
    }
}

如果用 RxSwift 來實現(xiàn),大致是這樣的:

let rxData: Observable<Data> = ...

rxData
    .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
    .observeOn(MainScheduler.instance)
    .subscribe(onNext: { [weak self] data in
        self?.data = data
    })
    .disposed(by: disposeBag)

subscribeOn

我們用 subscribeOn 來決定數(shù)據(jù)序列的構(gòu)建函數(shù)在哪個 Scheduler 上運行。以上例子中,由于獲取 Data 需要花很長的時間,所以用 subscribeOn 切換到 后臺 Scheduler 來獲取 Data。這樣可以避免主線程被阻塞。

observeOn

我們用 observeOn 來決定在哪個 Scheduler 監(jiān)聽這個數(shù)據(jù)序列。以上例子中,通過使用 observeOn 方法切換到主線程來監(jiān)聽并且處理結(jié)果。

一個比較典型的例子就是,在后臺發(fā)起網(wǎng)絡(luò)請求,然后解析數(shù)據(jù),最后在主線程刷新頁面。你就可以先用 subscribeOn 切到后臺去發(fā)送請求并解析數(shù)據(jù),最后用 observeOn 切換到主線程更新頁面。

MainScheduler

MainScheduler 代表主線程。如果你需要執(zhí)行一些和 UI 相關(guān)的任務(wù),就需要切換到該 Scheduler 運行。

SerialDispatchQueueScheduler

SerialDispatchQueueScheduler 抽象了串行 DispatchQueue。如果你需要執(zhí)行一些串行任務(wù),可以切換到這個 Scheduler 運行。

ConcurrentDispatchQueueScheduler

ConcurrentDispatchQueueScheduler 抽象了并行 DispatchQueue。如果你需要執(zhí)行一些并發(fā)任務(wù),可以切換到這個 Scheduler 運行。

OperationQueueScheduler

OperationQueueScheduler 抽象了 NSOperationQueue。

它具備 NSOperationQueue 的一些特點,例如,你可以通過設(shè)置 maxConcurrentOperationCount,來控制同時執(zhí)行并發(fā)任務(wù)的最大數(shù)量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容