Schedulers - 调度器
Schedulers是Rx实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。
如果你曾经使用过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)
.subscribe(onNext: { [weak self] data in
self?.data = data
})
.disposed(by: disposeBag)
使用subscribeOn
我们用subscribeOn来决定数据序列的构建函数在哪个Scheduler上运行。以上例子中,由于获取Data
需要花很长的时间,所以用subscribeOn切换到后台 Scheduler来获取Data
。这样可以避免主线程被阻塞。
使用observeOn
我们用observeOn来决定在哪个Scheduler监听这个数据序列。以上例子中,通过使用observeOn方法切换到主线程来监听并且处理结果。
一个比较典型的例子就是,在后台发起网络请求,然后解析数据,最后在主线程刷新页面。你就可以先用subscribeOn切到后台去发送请求并解析数据,最后用observeOn切换到主线程更新页面。
MainScheduler
MainScheduler 代表主线程。如果你需要执行一些和 UI 相关的任务,就需要切换到该 Scheduler 运行。
SerialDispatchQueueScheduler
SerialDispatchQueueScheduler 抽象了串行DispatchQueue
。如果你需要执行一些窜行任务,可以切换到这个 Scheduler 运行。
ConcurrentDispatchQueueScheduler
ConcurrentDispatchQueueScheduler 抽象了并行DispatchQueue
。如果你需要执行一些并发任务,可以切换到这个 Scheduler 运行。
OperationQueueScheduler
OperationQueueScheduler 抽象了NSOperationQueue
。
它具备NSOperationQueue
的一些特点,例如,你可以通过设置maxConcurrentOperationCount
,来控制同时执行并发任务的最大数量。