You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 02:27:04