我正在尝试进行几个 API 调用并填充领域数据库。
一切正常。但是,当我尝试运行 performSegue()
在 subscribe()
方法引发异常,通知我不能在后台线程上执行此操作,这是完全合理的。
但是由于我订阅了MainScheduler.instance
不应该 subscribe()
方法在 UI 线程上运行?
Single.zip(APIClient.shared.getSchools(), APIClient.shared.getPointsOfInterest())
.observeOn(SerialDispatchQueueScheduler(qos: .background))
.flatMap { zip in return Single.zip(SchoolDao.shared.insertSchools(schoolsJson: zip.0), PointOfInterestDao.shared.insertPointsOfInterest(poisJson: zip.1))}
.flatMap{ _ in Single.zip(SchoolDao.shared.countSchools(), PointOfInterestDao.shared.countPointsOfInterest())}
.subscribeOn(MainScheduler.instance)
.subscribe(onSuccess: { tableCounts in
let (schoolsCount, poisCount) = tableCounts
if(schoolsCount != 0 && poisCount != 0){
print(Thread.isMainThread) //Prints False
self.performSegue(withIdentifier: "splashToLogin", sender: nil)
}
}, onError: {
error in return
}).disposed(by: disposeBag)
我是否对 RXSwift 的工作原理做出了错误的假设?
编辑:如果我添加此行
.observeOn(MainScheduler.instance)
在 .subscribeOn(MainScheduler.instance)
之后subscribe 方法在主线程上运行。这是正确的行为吗?什么是.subscribeOn(MainScheduler.instance)
甚至在做什么?
最佳答案
您的编辑说明了一切。您对 subscribeOn 和 observeOn 的最初假设是倒退的。subscribeOn
运算符指的是链中的第一个可观察对象如何订阅最终的事件源(并且在任何情况下都可能不会执行您认为的操作。您的两个网络调用可能会设置自己的后台线程以在任何情况下发出值他们是如何订阅的。)observeOn
操作符是指将向观察者发送元素的调度程序(这是传递给 subscribe
操作符的代码块。)
这是一篇很好的文章,解释了整个事情:http://rx-marin.com/post/observeon-vs-subscribeon/
关于ios - RXSwift 未订阅主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58355951/