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:结合不同类型的可观察对象和映射结果的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift:嵌套可观察对象上的 FlatMap

RxSwift:将可完成映射到单个可观察?

在 Python 中结合两种不同的可迭代类型

RxSwift。结合最新。并不是所有的 observables 都发出了

未调用 RxSwift 订阅块

Rxswift 改变观察对象的值