1

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

我有 3 个 observables(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

4

1 回答 1

1

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

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

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

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

以上将发出savedValue,然后发出updatedValue每次isChanged发出的最后一次发出的内容。我建议您将名称更改为isChanged其他名称,因为它不是布尔值。

同时,这个问题意味着您想要更多类似的东西:

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

每次发出一个值时,上面也会isChanged发出一个值。savedValue每当isChanged发出 false 和发出 trueupdatedValue时,它​​都会发出isChanged


如果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 }
}
于 2021-06-20T11:20:21.820 回答