[英]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.