简体   繁体   English

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

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

I am pretty new to RxSwift and stuck in creating a sequence.我对 RxSwift 很陌生,并坚持创建一个序列。

I have 3 observables (isChanged, updatedValue, savedValue).我有 3 个 observables(isChanged、updatedValue、savedValue)。 If form value isChanged I want to use updatedValue otherwise savedValue.如果表单值 isChanged 我想使用 updatedValue 否则savedValue。 I tried using .combineLatest as我尝试使用 .combineLatest 作为

Observable.combineLatest( isChanged, updatedValue, savedValue,
resultSelector: {isChanged, updatedValue, savedValue in
   print ("\(isChanged), \(updatedValue), \(savedValue)")
 }.observeOn(MainSchedular.instance)
  .subscribe()
  .disposed(by: bag)

I want to use updatedValue only if isChanged flag is changed otherwise always use savedValue.我只想在 isChanged 标志更改时使用 updatedValue 否则总是使用savedValue。

I tried using flatMapLatest as well but I am struggling with syntax too.我也尝试使用 flatMapLatest 但我也在语法上挣扎。 Any help will be appreciated.任何帮助将不胜感激。 TIA TIA

Your comment describes a different use-case than what the question describes...您的评论描述的用例与问题描述的用例不同......

updatedValue is changed with every key strike, isChanged is called only when update button is tapped while savedValue is orignal value.每次击键都会更改更新值,仅当点击更新按钮时调用 isChanged,而 saveValue 是原始值。

The above implies that you want something like:以上暗示你想要类似的东西:

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

The above will emit the savedValue , then emit whatever was last emitted by updatedValue every time isChanged emits.上面将发出savedValue ,然后在每次isChanged发出时发出updatedValue最后发出的任何isChanged I suggest you change the name of isChanged to something else since it isn't a Bool.我建议您将isChanged的名称更改为其他名称,因为它不是 Bool。

Meanwhile, the question implies that you want something more like:同时,这个问题暗示你想要更像:

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

The above will also emit a value every time isChanged emits a value.每次isChanged发出一个值时,上面的代码也会发出一个值。 It will emit savedValue whenever isChanged emits false and updatedValue whenever isChanged emits true.它会发出savedValue时候isChanged发出虚假和updatedValue每当isChanged发出如此。


If savedValue is an Observable (maybe from a network request or a DB get) then the code would look more like this:如果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