Schedulers - 调度器

SchedulersRx实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。

如果你曾经使用过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,来控制同时执行并发任务的最大数量。

results matching ""

    No results matching ""