繁体   English   中英

RxSwift:结合不同类型的观察和映射结果

[英]RxSwift: Combining different types of observables and mapping result

我对 RxSwift 很陌生,并坚持创建一个序列。

我有 3 个 observables(isChanged、updatedValue、savedValue)。 如果表单值 isChanged 我想使用 updatedValue 否则savedValue。 我尝试使用 .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

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

每次击键都会更改更新值,仅当点击更新按钮时调用 isChanged,而 saveValue 是原始值。

以上暗示你想要类似的东西:

func example<Value>(savedValue: Value, isChanged: Observable<Void>, updatedValue: Observable<Value>) -> Observable<Value> {
    isChanged
        .withLatestFrom(updatedValue)
        .startWith(savedValue)
}

上面将发出savedValue ,然后在每次isChanged发出时发出updatedValue最后发出的任何isChanged 我建议您将isChanged的名称更改为其他名称,因为它不是 Bool。

同时,这个问题暗示你想要更像:

func exampleʹ<Value>(savedValue: Value, isChanged: Observable<Bool>, updatedValue: Observable<Value>) -> Observable<Value> {
    isChanged
        .withLatestFrom(updatedValue) { $0 ? savedValue : $1 }
}

每次isChanged发出一个值时,上面的代码也会发出一个值。 它会发出savedValue时候isChanged发出虚假和updatedValue每当isChanged发出如此。


如果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)) { $0 ? $1.0 : $1.1 }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM