ios - RXSwift 未订阅主线程
问题描述
我正在尝试进行几个 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)
这是正确的行为吗?.subscribeOn(MainScheduler.instance)
甚至在做什么?
解决方案
您的编辑说明了一切。您对 subscribeOn 和 observeOn 的最初假设是倒退的。
操作员指的subscribeOn
是链中的第一个可观察对象如何订阅事件的最终源(并且在任何情况下都可能不会做你认为它会做的事情。你的两个网络调用可能会设置自己的后台线程来发出值不管他们是如何订阅的。)
observeOn
操作员是指将向观察者发出元素的调度程序(这是传递给操作员的代码块。subscribe
)
这是一篇很棒的文章,解释了整个事情:http ://rx-marin.com/post/observeon-vs-subscribeon/
推荐阅读
- pandas - 在 Pandas 中在一行中分配日、周和年列
- node.js - gulp.dest 挂起复制一个电子构建的应用程序(macoS)
- python - 当我在 Pandas DataFrame 中使用数据透视函数时,这个奇怪的数字是多少?
- mongodb - 使用 Express 在 MongoDB 中进行 $text 查询所需的文本索引
- python - 这个程序正在返回模块 os 没有战士游戏的属性
- typescript - 在浏览器中运行 typescript 编译器
- openshift - 在 OpenShift 中从命令行获取 pod 上次重新启动
- flutter - 在 Flutter/Dart 中存储和显示餐厅订单详情
- php - Avast 现在删除了我的 server.php 文件
- shell - awk 中的管道如何工作(保留标头排序)