RxSwift:结合不同类型的可观察对象和映射结果
Posted
技术标签:
【中文标题】RxSwift:结合不同类型的可观察对象和映射结果【英文标题】:RxSwift: Combining different types of observables and mapping result 【发布时间】:2021-06-20 03:30:23 【问题描述】:我对 RxSwift 还很陌生,一直在创建一个序列。
我有 3 个可观察对象(isChanged、updatedValue、savedValue)。 如果表单值 isChanged 我想使用 updatedValue 否则 saveValue。 我尝试使用 .combineLatest 作为
Observable.combineLatest( isChanged, updatedValue, savedValue,
resultSelector: isChanged, updatedValue, savedValue in
print ("\(isChanged), \(updatedValue), \(savedValue)")
.observeOn(MainSchedular.instance)
.subscribe()
.disposed(by: bag)
我只想在 isChanged 标志改变时使用 updatedValue 否则总是使用 savedValue。
我也尝试过使用 flatMapLatest,但我也在语法上苦苦挣扎。任何帮助将不胜感激。 TIA
【问题讨论】:
听起来你只需要return isChanged ? updatedValue : savedValue
。
如果updatedValue
流仅在值更改时发送值,那么您只需要观察那个。
感谢您的 cmets。每次击键都会更改 updatedValue ,仅当点击更新按钮时才调用 isChanged ,而 savedValue 是原始值。事情是,一旦值被更新,标志为真,如果任何其他可观察值发生变化并且它弄乱了检查,那么下次这个流再次选择真。
【参考方案1】:
您的评论描述的用例与问题描述的不同......
updatedValue 会随着每次按键而改变,isChanged 仅在当 saveValue 是原始值时点击更新按钮时调用。
以上暗示你想要这样的东西:
func example<Value>(savedValue: Value, isChanged: Observable<Void>, updatedValue: Observable<Value>) -> Observable<Value>
isChanged
.withLatestFrom(updatedValue)
.startWith(savedValue)
上面会发出savedValue
,然后每次isChanged
发出时发出updatedValue
最后发出的任何东西。我建议您将 isChanged
的名称更改为其他名称,因为它不是 Bool。
同时,这个问题暗示你想要更多类似的东西:
func exampleʹ<Value>(savedValue: Value, isChanged: Observable<Bool>, updatedValue: Observable<Value>) -> Observable<Value>
isChanged
.withLatestFrom(updatedValue) $0 ? savedValue : $1
每次isChanged
发出一个值时,上面也会发出一个值。只要isChanged
发出假信号,它就会发出savedValue
,而只要isChanged
发出真信号,它就会发出updatedValue
。
如果savedValue
是一个 Observable(可能来自网络请求或 DB 获取),那么代码看起来更像这样:
func example<Value>(isChanged: Observable<Void>, savedValue: Observable<Value>, updatedValue: Observable<Value>) -> Observable<Value>
savedValue
.concat(
isChanged.withLatestFrom(updatedValue)
)
func exampleʹ<Value>(isChanged: Observable<Bool>, savedValue: Observable<Value>, updatedValue: Observable<Value>) -> Observable<Value>
isChanged
.withLatestFrom(Observable.combineLatest(savedValue, updatedValue)) $0 ? $1.0 : $1.1
【讨论】:
谢谢@Danie l.isChanged .withLatestFrom(updatedValue) 我需要这个运算符以上是关于RxSwift:结合不同类型的可观察对象和映射结果的主要内容,如果未能解决你的问题,请参考以下文章