RxSwift调度器 - Schedulers

简介: RxSwift调度器 - Schedulers

1. Schedulers简介

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

如果你曾经使用过GCD那你对以下代码应该不会陌生,耗时操作放在子线程,回到主线程中刷新UI

func testGCD() {
    DispatchQueue.global().async {
        //耗时操作代码
        DispatchQueue.main.async {
            //刷新UI
        }
    }
}

如果利用RxSwift应该怎么实现呢?请向下看:


2. subscribe(on:)

我们用subscribeOn来决定数据序列的构建函数在哪个Scheduler上运行,可以使用subscribeOn切换到后台Scheduler,这样可以避免主线程被阻塞;


loadData().subscribe(on: ConcurrentDispatchQueueScheduler(qos: .userInteractive))
func loadData() -> Observable<Int> {
    Observable.create { (oberver) -> Disposable in
        Logger("\(Date()) - 发起请求 - \(Thread.current)")
        sleep(3)
        //...
        oberver.onNext(1)
        return Disposables.create()
    }
}


3. observe(on:)

observeOn来决定在哪个Scheduler监听这个数据序列,通过使用observeOn方法切换到主线程来监听并且处理结果;

loadData().subscribe(on: ConcurrentDispatchQueueScheduler(qos: .userInteractive)).observe(on: MainScheduler.instance).subscribe { (value) in
    Logger("\(Thread.current)")
}.disposed(by: disposeBag)

运行结果:

Log - 2021-05-05 06:18:57 +0000 - 发起请求 - <NSThread: 0x60000183a380>{number = 6, name = (null)}
Log - <NSThread: 0x600001878100>{number = 1, name = main}


4. MainScheduler

MainScheduler代表主线程,如果需要执行一些和UI相关的任务,就需要切换到该Scheduler运行;


5. SerialDispatchQueueScheduler

SerialDispatchQueueScheduler抽象了串行DispatchQueue,如果需要执行一些串行任务,可以切换到这个Scheduler运行;


6. ConcurrentDispatchQueueScheduler

ConcurrentDispatchQueueScheduler抽象了并行DispatchQueue,如果需要执行一些并发任务,可以切换到这个Scheduler运行;


7. OperationQueueScheduler

OperationQueueScheduler抽象了NSOperationQueue,它具备NSOperationQueue的一些特点,例如:你可以通过设置maxConcurrentOperationCount,来控制同时执行并发任务的最大数量,请看示例代码(注意运行结果时间的不同):

func testQueue() {
    let queue = OperationQueue()
    queue.maxConcurrentOperationCount = 1
    loadData().subscribe(on: OperationQueueScheduler(operationQueue: queue)).observe(on: MainScheduler.instance).subscribe { (value) in
        Logger("\(Date()) - \(Thread.current)")
    }.disposed(by: disposeBag)
    loadData().subscribe(on: OperationQueueScheduler(operationQueue: queue)).observe(on: MainScheduler.instance).subscribe { (value) in
        Logger("\(Date()) - \(Thread.current)")
    }.disposed(by: disposeBag)
}

运行结果(maxConcurrentOperationCount = 1):

Log - 2021-05-05 06:23:47 +0000 - 发起请求 - <NSThread: 0x600003a3cec0>{number = 6, name = (null)}
Log - 2021-05-05 06:23:50 +0000 - <NSThread: 0x600003a70880>{number = 1, name = main}
Log - 2021-05-05 06:23:50 +0000 - 发起请求 - <NSThread: 0x600003a3db00>{number = 7, name = (null)}
Log - 2021-05-05 06:23:53 +0000 - <NSThread: 0x600003a70880>{number = 1, name = main}

运行结果(maxConcurrentOperationCount = 2):

Log - 2021-05-05 06:25:21 +0000 - 发起请求 - <NSThread: 0x60000061d780>{number = 5, name = (null)}
Log - 2021-05-05 06:25:21 +0000 - 发起请求 - <NSThread: 0x6000006777c0>{number = 6, name = (null)}
Log - 2021-05-05 06:25:24 +0000 - <NSThread: 0x60000063c300>{number = 1, name = main}
Log - 2021-05-05 06:25:24 +0000 - <NSThread: 0x60000063c300>{number = 1, name = main}
相关文章
|
1月前
|
缓存 Java 调度
使用scheduleAtFixedRate进行定时任务调度
使用scheduleAtFixedRate进行定时任务调度
|
2月前
|
Kubernetes 监控 调度
K8S中Scheduler原理分析
【6月更文挑战第20天】K8S Scheduler是集群的关键组件,它监听API Server,为新Pod选择合适的Node。
|
1月前
|
Java 调度
使用ScheduledThreadPoolExecutor进行任务调度
使用ScheduledThreadPoolExecutor进行任务调度
|
1月前
|
缓存 安全 Java
使用ScheduledExecutorService进行任务调度
使用ScheduledExecutorService进行任务调度
|
3月前
|
调度
APScheduler任务相关操作
APScheduler任务相关操作
27 0
|
3月前
|
存储 JavaScript 前端开发
RxJS中的调度器(Scheduler)机制
RxJS中的调度器(Scheduler)机制
120 0
|
3月前
|
前端开发 调度
300 行代码实现 React 的调度器 Scheduler
说是实现,但其实我们只是在 React Scheduler 源码的基础上进行了简化,省略掉一些繁琐的细节,添加了丰富的注释,保证代码可直接执行。 大家可以复制代码到编辑器中,直接运行,非常适合学习 React 源码用。
53 0
|
8月前
|
Kubernetes 算法 调度
基于kube-scheduler-simulator编写自己的调度程序
基于kube-scheduler-simulator编写自己的调度程序
93 0
|
Java 调度
ScheduledExecutorService:多线程任务调度
ScheduledExecutorService:多线程任务调度
743 0
ScheduledExecutorService:多线程任务调度