RxSwift:组合不同类型的可观察对象和映射结果

RxSwift: Combining different types of observables and mapping result

我是 RxSwift 的新手,一直在创建序列。

我有 3 个可观察值(isChanged、updatedValue、savedValue)。 如果表单值 isChanged 我想使用 updatedValue 否则 savedValue。 我尝试使用 .combineLatest as

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

您的评论描述的用例与问题描述的不同...

updatedValue is changed with every key strike, isChanged is called only when update button is tapped while savedValue is orignal value.

以上暗示你想要这样的东西:

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) { [=11=] ? savedValue :  }
}

上面也会在每次 isChanged 发出一个值时发出一个值。每当 isChanged 发出 false 时它会发出 savedValue 并且当 isChanged 发出 true 时它会发出 updatedValue


如果 savedValue 是一个 Observable(可能来自网络请求或数据库获取),那么代码看起来更像这样:

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)) { [=12=] ? .0 : .1 }
}