1. Schedulers简介
Schedulers
是RxSwift
实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行;
如果你曾经使用过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}