如何让RxSwift中do操作符的onSubscribe回调在主线程执行
RxSwift do(onSubscribe:) 执行UI操作主线程报错解决方案
核心原因
onSubscribe 回调的执行时机和现有调度操作符的作用范围不匹配:
observe(on: MainScheduler.instance)仅控制下游接收的next/error/completed事件的回调线程,和onSubscribe完全无关subscribe(on: MainScheduler.instance)仅控制上游序列订阅逻辑的执行线程,而onSubscribe会在你调用subscribe()方法的当前线程立刻执行,执行时机早于subscribe(on:)的调度逻辑,因此不会生效
解决方案
方案1:闭包内主动切主线程(最稳妥)
直接在 onSubscribe 闭包内用GCD主动切换到主队列执行UI操作,不受当前调用线程影响,示例代码如下:
checkCurrentNetworkAndConnect() .observe(on: MainScheduler.instance) .do(onSubscribe: { DispatchQueue.main.async { // UI 相关操作写在此处 } }) // 后续 subscribe、disposed 逻辑保持原有写法即可
方案2:保证subscribe调用线程为主线程
如果希望避免重复写切线程代码,可以直接把整个订阅逻辑放在主队列中执行,此时 onSubscribe 自然会在主线程触发:
DispatchQueue.main.async { checkCurrentNetworkAndConnect() .observe(on: MainScheduler.instance) .do(onSubscribe: { // 直接编写UI相关操作即可,当前已处于主线程 }) .subscribe(onNext: { // 原有业务逻辑 }) .disposed(by: disposeBag) }
内容的提问来源于stack exchange,提问作者Giorgio
相关产品推荐
相关产品推荐

