RxSwift 中的调度器
与 ReactiveCocoa 相比,Rx 的一大优势就是更丰富的并发模型。提到并发,就不得不提多线程。在 RxSwift 中,与线程对应的概念就是调度器,本文就调度器做些介绍,包括并发调度器、串行调度器、RxSwift 内置的调度器,及自定义调度器。
文章地址:https://www.cnblogs.com/xjshi/p/9759551.html
调度器抽象出了执行工作的机制,可以不怎么准确的认为调度器对应原本的线程。
observeOn 、 subscribeOn 这两个操作符可以与调度器配合使用。
如果你想在一个不同的调度器执行工作,那就使用 observeOn(scheduler) 操作符。
如果没有显式指定 observerOn ,那么工作会在产生元素的调度器来执行。
下边是一个使用 observeOn 的例子:
sequence1
  .observeOn(backgroundScheduler)
  .map { n in
      print("This is performed on the background scheduler")
  }
  .observeOn(MainScheduler.instance)
  .map { n in
      print("This is performed on the main scheduler")
  }
如果想要序列在指定调度器上生成(subscribe 方法)和 dispose,可以使用 subscribeOn(scheduler)。
如果没有明确指定 subscribeOn,那么将在调用 subscribe(onNext:) 或 subscribe 的同一调度器上调用 subscribe 闭包(传递给 Observable.create 的闭包)。
如果没有明确指定 subscribeOn,那么将在启动 disposing 的同一调度器上调用 dispose 方法。
简而言之,如果没有显式的选择调度器,那么将在当前调度器上调用这些方法。
串行调度器 vs 并发调度器
由于调度器可以是任何东西,并且所有转换序列的操作副都需要有额外的保证,因此你创建的是哪种调度器非常重要。
这里的保证是指,对所有的序列(Observable)而言,不论它在那个线程上产生元素,如果序列通过
observer.ron(.next(nextElement))将一个元素发送给观察者,那么序列在observer.on方法执行结束前不能发送下一个元素。如果
.next方法没有执行完成,序列也不能发送终止命令,如.completed或.error。这部分内容在RxSwift 入门一文中介绍过。
如果调度器是并发的,Rx 的 observeOn 和 subscribeOn 操作符将确保一切正常。
如果你使用Rx可以证明是串行的调度器,它能够执行额外的优化。
在串行调度器的情况下, observeOn 被优化为一个简单的 dispatch_async 调用。
自定义调度器
除了当前的调度器,你也可以实现自己的调度器。
如果你想要描述立即执行工作的调度器,可以实现 ImmediateScheduler 协议。
public protocol ImmediateScheduler {
    func schedule<StateType>(state: StateType, action: (/*ImmediateScheduler,*/ StateType) -> RxResult<Disposable>) -> RxResult<Disposable>
}
如果你想要支持基于事件的操作,那么你可以实现 Scheduler 协议:
public protocol Scheduler: ImmediateScheduler {
    associatedtype TimeInterval
    associatedtype Time
    var now : Time {
        get
    }
    func scheduleRelative<StateType>(state: StateType, dueTime: TimeInterval, action: (StateType) -> RxResult<Disposable>) -> RxResult<Disposable>
}
如果你想有周期执行的能力,你可以通过实现 PeriodicScheduler 协议来通知 Rx。
public protocol PeriodicScheduler : Scheduler {
    func schedulePeriodic<StateType>(state: StateType, startAfter: TimeInterval, period: TimeInterval, action: (StateType) -> StateType) -> RxResult<Disposable>
}
内置的调度器
上边我们提到 Rx 可以使用所有类型的调度器,但如果 Rx 可以证明调度器是串行的,那么会执行额外的优化
- CurrentThreadScheduler:它是一个串行调度器,表示当前执行工作的调度器。
 - MainScheduler:抽象了需要在主线程执行的工作,当然也是一个串行调度器。
 - SerialDispatchQueueScheduler:是一个串行调度器,抽象需要在一个 
dispatch_queue_t上执行的工作,它将确保即时传递并发调度队列(concurrent dispatch queue),它也会转换为串行队列。主调度器 也是 SerialDispatchQueueScheduler 的一个示例。 - ConcurrentDispatchQueueScheduler:是一个并发调度器,抽象需要在一个 
dispatch_queue_t上执行的工作。当一些任务需要在后台执行时,使用这个调度器。 - OperationQueueScheduler:抽象需要在 
NSOperationQueue上执行的工作。适用于需要在后台执行大量工作,并希望通过使用maxConcurrentOpeartionCount来调整并发处理的情况。 
本文中的部分表示 与 Rx 中的对照:
| 本文中的表示 | Rx中的表示 | 
|---|---|
| 调度器 | scheduler | 
| 串行调度器 | serial scheduler | 
| 并发调度器 | concurrent scheduler | 
RxSwift 中的调度器的更多相关文章
- Spring中Quartz调度器的使用
		
一.Quartz的特点 * 按作业类的继承方式来分,主要有以下两种: 1.作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 2. ...
 - 大数据之Yarn——Capacity调度器概念以及配置
		
试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...
 - [Spring]支持注解的Spring调度器
		
概述 如果想在Spring中使用任务调度功能,除了集成调度框架Quartz这种方式,也可以使用Spring自己的调度任务框架. 使用Spring的调度框架,优点是:支持注解(@Scheduler),可 ...
 - Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析
		
最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题.本文首先简单介绍脏调度器机制的用法,然后简 ...
 - Cocos2d-X3.0 刨根问底(六)----- 调度器Scheduler类源码分析
		
上一章,我们分析Node类的源码,在Node类里面耦合了一个 Scheduler 类的对象,这章我们就来剖析Cocos2d-x的调度器 Scheduler 类的源码,从源码中去了解它的实现与应用方法. ...
 - Hadoop的调度器总结
		
Hadoop的调度器总结 随着MapReduce的流行,其开源实现Hadoop也变得越来越受推崇.在Hadoop系统中,有一个组件非常重要,那就是调度器,它的作用是将系统中空闲的资源按一定策略分配给作 ...
 - Erlang调度器细节探析
		
Erlang调度器细节探析 Erlang的很多基础特性使得它成为一个软实时的平台.其中包括垃圾回收机制,详细内容可以参见我的上一篇文章Erlang Garbage Collection Details ...
 - Linux CFS调度器之task_tick_fair处理周期性调度器--Linux进程的管理与调度(二十九)
		
1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期 ...
 - goroutine与调度器
		
29 November 2013 by skoo 我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine.goroutine就是Go语言提供的一种用户态线程,当然这种用 ...
 
随机推荐
- Python学习 之 计算机基础
			
第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 等组成,只有硬件但硬件之间无法进行交流和通信 1.2 操作系统 操作系统用于协同或控制硬 ...
 - Vue函数式组件的应用
			
一.函数式组件和普通组件的区别 渲染快 没有实例,意味着没有(this) 没有生命周期(没有响应式数据) 二.组件函数的使用 1. 以局部组件为例,将组件标记为 functional=ture; 因为 ...
 - 初识云计算 -《AWS云端企业实战圣经》读书笔记
			
原书中涉及实操的地方,在本文中被省略.一是篇幅太长,放入文中太过累赘,二是原书成书过早,现在 AWS 的界面早已变化很大,不具备参考性. 第一章 谁在使用云计算 1.什么是云计算 云计算(cloud ...
 - 微信小程序捕获async/await函数异常实践
			
背景 我们的小程序项目的构建是与web项目保持一致的,完全使用webpack的生态来构建,没有使用小程序自带的构建功能,那么就需要我们配置代码转换的babel插件如Promise.Proxy等:另外, ...
 - 欧几里得(Euclid)与拓展的欧几里得算法
			
欧几里得(Euclid)与拓展的欧几里得算法 欧几里得(Euclid)与拓展的欧几里得算法 欧几里得算法 原理 实现 拓展的欧几里得算法 原理 递归求解 迭代求解 欧几里得算法 原理 欧几里得算法是一 ...
 - Python MySQL 数据库
			
python DB API python访问数据库的统一接口规范,完成不同数据库的访问 包含的内容: connection cursor exceptions 访问数据库流程: 1.创建connect ...
 - Codeforces Round #480 (Div. 2)  B. Marlin
			
题目地址:http://codeforces.com/contest/980/problem/B 官方题解: 题意: 有一个城市有4行n列,n是奇数,有一个村庄在(1,1),村民在(4,n)钓鱼:还有 ...
 - x86_64 Linux 运行时栈的字节对齐
			
前言 C语言的过程调用机制(即函数之间的调用)的一个关键特性(起始大多数编程语言也是如此)都是使用了栈数据结构提供的后进先出的内存管理原则.每一个函数的栈空间被称为栈帧,一个栈帧上包含了保存的寄存器. ...
 - FastJson格式化Request对象导致的一次异常思考
			
一.问题描述: 近期,在环境中出现一个阻塞性的异常“nested exception is java.lang.IllegalStateException: It is illegal to call ...
 - java第一次测验
			
package kaoshi; import java.util.Scanner; public class ScoreManagement { static int t=0; static int ...