首页 > 解决方案 > 关于自定义 RxSwift Observable 扩展的问题

问题描述

extension Observable {
    func dispatchAsyncMainScheduler() -> Observable<E> {
        return self.observeOn(backgroundScheduler).observeOn(MainScheduler.instance)
    }
}

我在https://github.com/artsy/eidolon找到了这个片段

我是reactive这里的初学者。据我了解。subscribeOn适用于整个链,而observeOn它下面的应用运算符。

我的问题很明显,这两个连续到底是observeOn做什么的?

标签: iosswiftrx-swiftreactivex

解决方案


这不是一个错字。如果你看一下backgroundScheduler这个运算符上面 10 行的定义,你会发现它是一个SerialDispatchQueueSceduler. 这意味着它将操作排队并在后台线程上按顺序执行它们。

他们正在使用它来避免重入异常。我假设这段代码是在MainScheduler.asyncInstance放入库之前编写的,它做同样的事情。

更多信息可以在 Rx 库中找到:

  • 问题:这种行为破坏了可观察序列语法。next (error | completed)? 这种行为破坏了语法,因为序列事件之间存在重叠。可观察序列试图在前一个事件的发送完成之前发送一个事件。
  • 解释:这可能意味着您的代码中存在某种意外的循环依赖,或者系统未按预期方式运行。
  • 补救措施:如果这是预期的行为,则可以通过添加.observeOn(MainScheduler.asyncInstance) 或以其他方式将序列事件加入队列来抑制此消息。

推荐阅读