我想在我的 iOS 应用程序的后台线程中做一些繁重的工作,而不是在执行时冻结 UI。我尝试的是:
self.someDisposable = heavyLiftingFuncReturningObservable()
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.observeOn(MainScheduler.instance)
.subscribe(
onNext: { [weak self] image in
// update UI
},
onError: { ... }
)
为什么上述方法没有按预期工作以及如何使其工作?
问题在于您对 .heavyLiftingFuncReturningObservable(( 的实现,即显然它开始在当前线程上工作,而不是等到订阅并在后台调度程序上运行。解决方案是在 .heavyLiftingFuncReturningObservable(( 函数中使用 .deferred((。
请参阅 http://adamborek.com/top-7-rxswift-mistakes/
你可以这样做:
self.someDisposable = Observable.just(0) // dummy
.observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.flatMap { [unowned self] _ in
heavyLiftingFuncReturningObservable()
}
.observeOn(MainScheduler.instance)
.subscribe(
onNext: { [weak self] image in
// update UI
},
onError: { ... }
)
不要这样做...使用Observable.deferred { }
方法
将繁重的任务放在块中,它将在订阅上运行。
如果工作具有单个响应,请使用Single
可观察类型。
如果工作只需要完成,请使用Completable
可观察的类型
使用 observeOn
/subscribleOn
运算符来控制执行工作的线程。
最重要的是,不要在此用例中使用 RX。