ios - RXSwift 未订阅主线程

标签 ios swift rx-swift

我正在尝试进行几个 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/

相关文章:

ios - 在 Objective-C 中从 NSarray 中获取字符

ios - 我的注释未在 PIN 码中显示副标题

ios - "XXX-Swift.h"测试项目中找不到文件

ios - 使用 swift 2.2 以编程方式向 UITableView 添加 header

ios - 转换为 ARC 无法识别 -fno-objc-arc 标志

ios - swift 2 : error when try to find with indexOf

swift - RX 中是否存在只读的 BehaviorSubject 接口(interface)?如果不存在,那么创建一个是不是一个坏主意?

IOS RxSwift 从 Observable 数组创建 Observable 数组

ios - 我们什么时候应该在 RxSwift 中调用 addDisposableTo(disposeBag)?

ios - 如何将拖动单元​​格的 indexPath.row 传递给函数? ( swift )