subscribeOn和observeOn的顺序是否重要?

时间:2016-06-22 16:18:54

标签: swift multithreading rx-swift

我对可以在observable上调用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)

如果我正确理解它们的机制不同。第一个在主线程上完成所有工作,第二个在另一个线程上完成所有工作,然后调度回主线程。但我很坚定,所以有人可以帮我清楚一下吗?

3 个答案:

答案 0 :(得分:55)

你在链中调用subscribeOn()并不重要。你致电observeOn()的地方很重要。

subscribeOn()告诉整个链到开始处理的线程。你应该只为每个链调用一次。如果你再次调用它,那么它将无效。

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

采用以下示例:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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