RxSwift:组合不同类型的可观察对象和映射结果
RxSwift: Combining different types of observables and mapping result
我是 RxSwift 的新手,一直在创建序列。
我有 3 个可观察值(isChanged、updatedValue、savedValue)。
如果表单值 isChanged 我想使用 updatedValue 否则 savedValue。
我尝试使用 .combineLatest as
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
您的评论描述的用例与问题描述的不同...
updatedValue is changed with every key strike, isChanged is called only when update button is tapped while savedValue is orignal value.
以上暗示你想要这样的东西:
func example<Value>(savedValue: Value, isChanged: Observable<Void>, updatedValue: Observable<Value>) -> Observable<Value> {
isChanged
.withLatestFrom(updatedValue)
.startWith(savedValue)
}
以上将发出 savedValue
,然后每次 isChanged
发出时发出 updatedValue
最后发出的任何内容。我建议您将 isChanged
的名称更改为其他名称,因为它不是 Bool。
同时,这个问题暗示你想要更像的东西:
func exampleʹ<Value>(savedValue: Value, isChanged: Observable<Bool>, updatedValue: Observable<Value>) -> Observable<Value> {
isChanged
.withLatestFrom(updatedValue) { [=11=] ? savedValue : }
}
上面也会在每次 isChanged
发出一个值时发出一个值。每当 isChanged
发出 false 时它会发出 savedValue
并且当 isChanged
发出 true 时它会发出 updatedValue
。
如果 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)) { [=12=] ? .0 : .1 }
}
我是 RxSwift 的新手,一直在创建序列。
我有 3 个可观察值(isChanged、updatedValue、savedValue)。 如果表单值 isChanged 我想使用 updatedValue 否则 savedValue。 我尝试使用 .combineLatest as
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
您的评论描述的用例与问题描述的不同...
updatedValue is changed with every key strike, isChanged is called only when update button is tapped while savedValue is orignal value.
以上暗示你想要这样的东西:
func example<Value>(savedValue: Value, isChanged: Observable<Void>, updatedValue: Observable<Value>) -> Observable<Value> {
isChanged
.withLatestFrom(updatedValue)
.startWith(savedValue)
}
以上将发出 savedValue
,然后每次 isChanged
发出时发出 updatedValue
最后发出的任何内容。我建议您将 isChanged
的名称更改为其他名称,因为它不是 Bool。
同时,这个问题暗示你想要更像的东西:
func exampleʹ<Value>(savedValue: Value, isChanged: Observable<Bool>, updatedValue: Observable<Value>) -> Observable<Value> {
isChanged
.withLatestFrom(updatedValue) { [=11=] ? savedValue : }
}
上面也会在每次 isChanged
发出一个值时发出一个值。每当 isChanged
发出 false 时它会发出 savedValue
并且当 isChanged
发出 true 时它会发出 updatedValue
。
如果 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)) { [=12=] ? .0 : .1 }
}