RxSwift文档五(Schedulers)

代码下载

Schedulers

  1. 串行与并发调度程序
  2. 自定义调度程序
  3. 内置调度程序

Schedulers抽象出执行工作的机制。

执行工作的机制包括当前线程,调度队列(dispatch queues),操作队列(operation queues),新线程,线程池和运行循环。

有两个主要的操作符使用Schedulers,observeOn和subscribeOn。

如果要在不同的Schedulers上执行工作,只需使用observeOn(scheduler)操作符。

通常使用observeOn多于subscribeOn。

如果observeOn未明确指定,则将在生成元素的任何线程/scheduler执行工作。

使用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")
  }

如果要在特定scheduler上启动序列生成元素(subscribe方法)并调用dispose,请使用subscribeOn(scheduler)。

如果subscribeOn未明确指定,则将在调用subscribe(onNext:)或调用subscribe的同一线程/scheduler上调用subscribe闭包(传递给Observable.create的闭包)。

如果subscribeOn未明确指定,dispose方法则将在启动disposing的同一线程/scheduler上调用。

简而言之,如果没有选择显式调度程序,那么将在当前线程/scheduler上调用这些方法。

串行与并发Schedulers

由于Schedulers确实可以是任何东西,并且所有转换序列的操作符都需要保留额外的隐式保证,因此创建的是哪种Schedulers非常重要。

如果调度程序是并发的,Rx的observeOn和subscribeOn操作符将确保一切正常。

如果使用Rx可以证明某些scheduler是串行的,将可以执行一些其他优化。

到目前为止,只对调度队列调度程序执行那些优化。

在串行scheduler的情况下,observeOn优化只是一个简单的dispatch_async调用。

自定义Schedulers

除了已有的Schedulers,还可以编写自己的Schedulers。

如果只想描述谁需要立即执行工作,可以通过实现ImmediateScheduler协议来创建自己的Schedulers。

public protocol ImmediateScheduler {
    func schedule<StateType>(state: StateType, action: (/*ImmediateScheduler,*/ StateType) -> RxResult<Disposable>) -> RxResult<Disposable>
}

如果要创建支持基于时间操作的新Schedulers,则需要实现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>
}

如果Schedulers仅具有定期调度功能,则可以通过实现PeriodicScheduler协议来通知Rx :

public protocol PeriodicScheduler : Scheduler {
    func schedulePeriodic<StateType>(state: StateType, startAfter: TimeInterval, period: TimeInterval, action: (StateType) -> StateType) -> RxResult<Disposable>
}

这种情况下如果Schedulers不支持PeriodicScheduling功能,Rx将显式模拟定期调度。

内置Schedulers

Rx可以使用所有类型的schedulers,但如果具有scheduler是串行的证据,还可以执行一些额外的优化。

这些是当前支持的schedulers:

CurrentThreadScheduler(串行scheduler)

当前线程的工作单元。这是生成元素的操作符的默认scheduler。

该scheduler有时也称为"trampoline scheduler"。

如果CurrentThreadScheduler.instance.schedule(state) { }在某个线程上第一次调用,则将立即执行调度的操作,并将创建一个隐藏的队列,其中所有递归调度的操作将暂时排入队列。

如果在调用堆栈上的某个父框架已运行CurrentThreadScheduler.instance.schedule(state) { },则当前正在运行的操作和所有先前排队的操作已完成执行时,计划的操作将被排入队队列并执行。

MainScheduler(串行scheduler)

需要在MainThread执行的工作。如果schedule从主线程调用方法,它将立即执行操作而无需调度。

此调度程序通常用于执行UI工作。

SerialDispatchQueueScheduler(串行scheduler)

需要把工作抽象到特定的dispatch_queue_t执行。它将确保即使通过并发scheduler,它也会转换为串行队列。

串行scheduler使用observeOn启用某些优化。

main scheduler是一个SerialDispatchQueueScheduler实例。

ConcurrentDispatchQueueScheduler(并发scheduler)

需要把工作抽象到特定的dispatch_queue_t执行。也可以通过一个串行调度队列,不应该导致任何问题。

当需要在后台执行某些工作时,此scheduler适用。

OperationQueueScheduler(并发scheduler)

需要把工作抽象到特定的NSOperationQueue执行。

此scheduler适用于需要在后台执行大量工作并且希望使用maxConcurrentOperationCount处理并发数量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355