我对可以在observable上调用subscribeOn
和observeOn
方法的顺序感到有点困惑。我读了几篇帖子,其中一个人说这没关系,只是在他的例子中使用了东西而其他人说它确实很重要。所以这是我的问题:
例如:
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)
如果我正确理解它们的机制不同。第一个在主线程上完成所有工作,第二个在另一个线程上完成所有工作,然后调度回主线程。但我很坚定,所以有人可以帮我清楚一下吗?
答案 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 答案 1 :(得分:1)
是的,你是对的。 observeOn
只接收您指定的线程上的事件,而subscribeOn
将实际执行指定线程内的工作。
答案 2 :(得分:1)
.subscribeOn()运算符影响将创建sheduler链(在其左侧)并且它可以工作一次。 .observeOn()影响运算符的右侧 - 在运算符之后将处理调度程序数据。