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}
相关文章
|
存储 缓存 数据管理
HarmonyOS学习路之开发篇—数据管理(轻量级数据存储)
轻量级数据存储适用于对Key-Value结构的数据进行存取和持久化操作。应用获取某个轻量级存储对象后,该存储对象中的数据将会被缓存在内存中,以便应用获得更快的数据存取速度。应用也可以将缓存的数据再次写回文本文件中进行持久化存储,由于文件读写将产生不可避免的系统资源开销,建议应用减少对持久化文件的读写频率。
|
26天前
Vite使用svg-企业级开发(支持本地svg和网络svg渲染)
本教程介绍如何在Vite项目中集成SVG图标插件。首先安装`vite-plugin-svg-icons`,配置插件指向SVG图标目录,并注册全局组件。接着创建SVG图标组件,支持内部图标与外部图片展示。通过简单配置,即可在页面中灵活使用各类SVG图标,提升开发效率。
84 0
|
Kubernetes 搜索推荐 前端开发
containerd 镜像构建工具 -- nerdctl 和 buildkit
containerd 镜像构建工具 -- nerdctl 和 buildkit
7650 0
手势代理 shouldBeRequiredToFailByGestureRecognizer 和 shouldRequireFailureOfGestureRecognizer 的区别
手势代理 shouldBeRequiredToFailByGestureRecognizer 和 shouldRequireFailureOfGestureRecognizer 的区别
356 10
|
12月前
|
存储 Kubernetes Docker
|
安全 搜索推荐 SEO
如何完整搭建一个独立站?
如何完整搭建一个独立站?没有建站基础和经验、能不能自己建站?
1255 14
|
设计模式 算法 数据可视化
分析大型软件系统的经典方法
【6月更文挑战第19天】本文介绍ATAM(架构权衡分析方法)是一种评估大型软件系统架构的工具,着重考虑性能、可用性、安全性和可修改性等质量属性的交互。ATAM提供了一种结构化方法,确保在设计早期就能理解和平衡各种质量属性,以优化系统整体性能。
788 2
分析大型软件系统的经典方法
|
SQL NoSQL JavaScript
04 MongoDB各种查询操作 以及聚合操作总结
文章全面总结了MongoDB中的查询操作及聚合操作,包括基本查询、条件筛选、排序以及聚合管道的使用方法和实例。
2375 0
|
SQL 关系型数据库 MySQL
详解MySQL覆盖索引、索引下推
1.覆盖索引 1.1.概述 覆盖索引,是为了避免“回表查询”,从而降低查询耗时的一种使用索引的方法,所以要聊覆盖索引首先我们要知道什么是"回表查询,“回表查询”是因为MySQL的索引结构决定的,是因为非聚集索引要找聚集索引拿数据而出现的现象,所以我们又要先了解MySQL中的聚集索引和非聚集索引。 文章的脉络就是先聊聚集索引、非聚集索引是怎么带来了“回表查询”的问题,然后怎么用用覆盖索引解决这个问题。
2175 0
RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别
RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别
712 1