gpt4 book ai didi

swift - subscribeOn 和 observeOn 的顺序重要吗?

转载 作者:IT王子 更新时间:2023-10-29 05:08:12 33 4
gpt4 key购买 nike

我对在可观察对象上调用 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)

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

最佳答案

在链中调用 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 上

关于swift - subscribeOn 和 observeOn 的顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973445/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com