簡體   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