RXSwift 未订阅主线程

Exp*_*ove 8 ios swift rx-swift

我正在尝试进行多个 API 调用并填充 Realm 数据库。一切正常。但是,当我尝试performSegue()subscribe()方法上运行时,会引发异常,通知我无法在后台线程上执行此操作,这是完全合理的。

但是既然我订阅了MainScheduler.instancesubscribe()方法不应该在 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)
Run Code Online (Sandbox Code Playgroud)

我是否对 RXSwift 的工作原理做出了错误的假设?

编辑:如果我在订阅方法在主线程上运行.observeOn(MainScheduler.instance)后添加这一行.subscribeOn(MainScheduler.instance)。这是正确的行为吗?什么是.subscribeOn(MainScheduler.instance)即使在做什么?

Dan*_* T. 7

您的编辑说明了一切。您对 subscribeOn 和 observeOn 的初始假设是倒退的。

subscribeOn运营商指的是如何在第一个观察的链订阅了事件的最终来源(可能不会做你认为它在任何情况下,你的两个网络电话有可能建立自己的后台线程发出值上不管他们是如何订阅的。)

observeOn操作者指的是将发光元件到观察者的调度器(其是被传递给代码块(多个)subscribe操作符。)

这是一篇很好的文章,解释了整个事情:http : //rx-marin.com/post/observeon-vs-subscribeon/