- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在强制执行 Observable.create
的某部分时代码在特定线程(即后台线程)中运行,我担心使用 subscribeOn
运算符可能不起作用,因为有时我可能会将此可观察序列链接到另一个在主线程上运行的可观察序列(使用 observeOn
)。
情况是我在主线程上运行了一个 Observable 序列(即一个警告框,要求用户输入是否执行网络调用)。
确保这个 Observable.create
会更好吗?代码通过类似以下内容在后台线程中运行:
Observable<String>.empty()
.observeOn(ConcurrentMainScheduler(queue: background.queue))
.concat(myObservableNetworkCall)
subscribeOn
?问题是如果我使用了subscribeOn
(第二个)和之前的可观察对象(警报 Controller )设置为使用 subscribeOn
在后台线程上运行(第一个),然后是第二个 subscribeOn
运算符将不起作用,因为第一次调用更接近源可观察对象:
If you specify multiple subscribeOn() operators, the one closes to the source (the left-most), will be the one used.
- Thomas Nield on RxJava's subscribeOn and observeOn operators (February 2016)
这可能是 RxJava 的行为,但我不确定 Swift 的行为。 Reactivex.io 只是说我们不应该调用 subscribeOn
多次。
我倾向于将操作包装到 Observable<Void>
中s 并且它们需要在不同的线程上运行...这就是为什么我要问如何确保 Observable 代码在我指定的线程中运行。 subscribeOn
行不通,因为我可以连接可观察对象。
我希望它应该运行的线程被封装在我的 Observable 定义中,而不是在链的更高层。
最佳做法是执行以下操作:
observeOn
强制我希望它在其中运行的线程。我已阅读 subscribeOn
和 observeOn
关于 reactx.io 的文档。
我熟悉如何使用 subscribeOn
在线程之间切换和 observeOn
.
我特别关心的是使用 subscribeOn
的复杂性在连接或组合可观察序列时。
问题是,可观察对象需要专门在一个线程上运行,而且它们不知道它们将在何处以及与谁连接。因为我确切地知道它们应该在哪个线程上运行,所以我更愿意将调度程序定义封装在可观察对象的定义中,而不是在链接序列时。
最佳答案
在函数声明中最好不要指定在哪个线程上调用该函数。例如:
func myObservableNetworkCall() -> Observable<String> {
return Observable<String>.create { observer in
// your network code here
return Disposables.create {
// Your dispose
}
}
}
func otherObservableNetworkCall(s: String) -> Observable<String> {
return Observable<String>.create { observer in
// your network code here
return Disposables.create {
// Your dispose
}
}
}
然后在调度器之间切换:
myObservableNetworkCall()
.observeOn(ConcurrentMainScheduler(queue: background.queue)) // .background thread, network request, mapping, etc...
.flatMap { string in
otherObservableNetworkCall(s: string)
}
.observeOn(MainScheduler.instance) // switch to MainScheduler, UI updates
.subscribe(onNext:{ string in
// do something
})
关于swift - 连接两个都具有 subscribeOn 的可观察序列。如何确保我的可观察对象在线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42086454/
我是一名优秀的程序员,十分优秀!