subscribeOn 和 observeOn 的顺序重要吗?
Does the order of subscribeOn and observeOn matter?
我对在可观察对象上调用 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)
如果我正确理解了它们不同的机制。第一个在主线程上完成所有工作,第二个在另一个线程上完成所有工作,然后分派回主线程。但我很确定,有人可以帮我解决这个问题吗?
是的,你是对的。 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() 影响其右侧的运算符 - 在运算符之后将处理哪些调度程序数据。
我对在可观察对象上调用 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)
如果我正确理解了它们不同的机制。第一个在主线程上完成所有工作,第二个在另一个线程上完成所有工作,然后分派回主线程。但我很确定,有人可以帮我解决这个问题吗?
是的,你是对的。 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() 影响其右侧的运算符 - 在运算符之后将处理哪些调度程序数据。