RxSwift嵌套Observable执行FlatMap操作后无法接收事件问题求助
问题根因
你当前的editor是基于user派生的普通冷 Observable,每新增一个订阅就会生成独立的订阅流,每当user发射新值时,map闭包会为每个订阅单独生成不同的 EditorViewModel 实例。
你的测试代码中存在两个独立的editor订阅:flatMapLatest链是第一个订阅,直接监听打印的是第二个订阅。当你给user发送"1"时,两个订阅各自拿到了不同的编辑器实例,你在第二个订阅里给实例发送的item事件,自然不会被第一个订阅监听的另一个实例收到。
解决方案
在派生editor的时候增加共享订阅操作符,确保所有订阅者拿到的是同一个编辑器实例,只需修改ParentViewModel的init逻辑即可:
init() { editor = user .compactMap { $0 } .map { EditorViewModel(user: $0) } // 新增共享订阅逻辑,缓存最新1个实例给后续新订阅者 .share(replay: 1, scope: .whileConnected) }
修改后运行原有测试代码,即可正常触发flatMapLatest的item监听回调。
优化建议
- 可以给
EditorViewModel增加DisposeBag属性,当用户切换、旧编辑器实例销毁时,自动清理其内部的所有订阅,避免内存泄漏。 - 如果你需要后续订阅编辑器的逻辑能拿到最近一次保存的内容,可以把
PublishSubject<String>替换为BehaviorSubject<String>,避免新订阅者错过历史保存事件。 - 如果业务需要支持用户取消选择(
user为nil)的场景,可以移除compactMap,将editor的类型改为Observable<EditorViewModel?>,在下游订阅时做空值处理即可。
内容的提问来源于stack exchange,提问作者Vahid
相关产品推荐
相关产品推荐

