RxSwift中如何在PublishRelay触发时更新现有Observable逻辑?
解决方案
可以通过合并两个数据流来实现需求:一个保留原有的触发逻辑(observable1 发射时计算),另一个处理 publishRelay 触发时的重新计算,同时保证无需等待 publishRelay 先触发。
步骤1:抽离计算逻辑(复用代码)
先把重复的计算逻辑抽成闭包,避免代码冗余:
// 假设 Obs1Type 是 observable1 的值类型,Obs2Type 是 observable2 的值类型 let calculateResult: (Obs1Type, Obs2Type) -> [SomeDataType] = { obs1Value, obs2Value in obs1Value.someFunction(for: obs2Value) }
步骤2:保留原有触发流
维持原有的逻辑:当 observable1 发射值时,取 observable2 的最新值计算:
let originalTriggerStream = observable1 .withLatestFrom(observable2, resultSelector: calculateResult)
步骤3:处理 publishRelay 的触发流
当 publishRelay 触发时,同时获取 observable1 和 observable2 的最新值进行计算:
let relayTriggerStream = publishRelay .asObservable() // 触发时获取 observable1 和 observable2 的最新组合值 .withLatestFrom(Observable.combineLatest(observable1, observable2)) { _, valuePair in valuePair } .map(calculateResult)
步骤4:合并两个流并绑定
将两个流合并,任何一个流触发时都会更新 someSubject:
Observable.merge(originalTriggerStream, relayTriggerStream) .bind(to: someSubject) .disposed(by: disposeBag)
逻辑说明
- 原有逻辑不受影响:只要
observable1发射值,立刻用observable2的最新值计算,无需等待publishRelay。 publishRelay触发时:会自动获取当前observable1和observable2的最新值(前提是这两个序列之前已经发射过至少一次值),执行计算并更新someSubject。- 如果
observable1或observable2从未发射过值,publishRelay触发时不会产生输出(因为没有可用的计算数据,这是合理的边界情况)。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

