RxSwift使用withLatestFrom时订阅回调未触发问题排查
核心问题原因
1. 父类组合流参数拼写错误
你在parent类中构造组合监听流时,第三个参数错误重复使用了streamB,没有监听streamC:
// 错误写法 BehaviorRelay.combineLatest(streamA.filterNil(), streamB.filterNil(), streamB.filterNil())
这就导致只要streamA、streamB两个流有值,父类就会触发moduleVisibility.accept(true),此时streamC还未赋值,child类中withLatestFrom后的组合流需要A、B、C三个流都至少发出过一次有效值才会激活输出,所以这次moduleVisibility的true事件会被直接丢弃。等后续你给streamC赋值时,父类的组合流因为没有监听streamC,不会再次触发moduleVisibility发新事件,child类的订阅自然不会执行。
解决方案
把父类组合流的第三个参数改为streamC即可:
BehaviorRelay.combineLatest(streamA.filterNil(), streamB.filterNil(), streamC.filterNil()).subscribe { [weak self ] _, _, _ in guard let self = self else { return } self.moduleVisibility.accept(true) }.disposed(by: bag)
修改后,父类会等A、B、C三个流都有有效值之后才会触发moduleVisibility发true,此时child类中withLatestFrom后的组合流也已经集齐三个有效值,会正常触发订阅回调。
额外说明
你提到的线程问题不是本次报错的原因,observeOn(MainScheduler.instance)只是把订阅回调切到主线程执行,不会影响事件的触发逻辑。
内容的提问来源于stack exchange,提问作者Pang Ho Ming
相关产品推荐
相关产品推荐

