subscribeOn 和 observeOn 的顺序重要吗?

Does the order of subscribeOn and observeOn matter?

我对在可观察对象上调用 subscribeOnobserveOn 方法的顺序有点困惑。我读了几篇文章,一个人说没关系,只是在他的例子中使用了东西,其他人说这很重要。所以这是我的问题:

例如:

self.remoteService.rxGetAllLanguages()
            .observeOn(MainScheduler.instance)
            .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
            .subscribe({ e in
                switch e {
                case .Next(let element):

                case .Error(let e):
                    DDLogError("Error in  \(e)")
                case .Completed:
                    DDLogDebug("Completed")
                }
                }
            ).addDisposableTo(self.disposeBag)

是否与以下内容相同:

  self.remoteService.rxGetAllLanguages()
                    .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
                    .observeOn(MainScheduler.instance)
                    .subscribe({ e in
                        switch e {
                        case .Next(let element):

                        case .Error(let e):
                            DDLogError("Error in  \(e)")
                        case .Completed:
                            DDLogDebug("Completed")
                        }
                        }
                    ).addDisposableTo(self.disposeBag)

如果我正确理解了它们不同的机制。第一个在主线程上完成所有工作,第二个在另一个线程上完成所有工作,然后分派回主线程。但我很确定,有人可以帮我解决这个问题吗?

是的,你是对的。 observeOn 只会在您指定的线程上接收事件,而 subscribeOn 将实际执行指定线程内的工作。

在链中调用 subscribeOn() 的位置并不重要。你打电话给 observeOn() 的地方很重要。

subscribeOn() 告诉整个链在哪个线程上 start 处理。你应该只为每个链调用一次。如果您在下游再次调用它,它将无效。

observeOn() 导致在它下面发生的所有操作都在指定的调度程序上执行。您可以在每个流中多次调用它以在不同线程之间移动。

举个例子:

doSomethingRx()
    .subscribeOn(BackgroundScheduler)
    .doAnotherThing()
    .observeOn(ComputationScheduler)
    .doSomethingElse()
    .observeOn(MainScheduler)
    .subscribe(//...)
  • subscribeOn 导致在 BackgroundScheduler 上调用 doSomethingRx
  • doAnotherThing 将在 BackgroundScheduler
  • 上继续
  • 然后 observeOn 将流切换到 ComputationScheduler
  • doSomethingElse 将发生在 ComputationScheduler
  • 另一个observeOn将流切换到MainScheduler
  • 订阅发生在 MainScheduler

.subscribeOn() 运算符影响将创建哪个调度器链(在它的左侧)并且它只工作一次。 .observeOn() 影响其右侧的运算符 - 在运算符之后将处理哪些调度程序数据。