RxSwift。结合最新。不是所有的可观察物都发出
RxSwift. CombineLatest. Not all observables emitted
Observable.combineLatest(...){...} 包含多个可观察值,但其中一些未发出。
combineLatest 仅当此方法中的所有 observable 都已发出时才会发出。
如何跳过未发出的可观察对象并发出 combineLatest?
let tap = firstButton.rx.tap.asObservable().map{ (_) -> Observable<Item> ...}
let textfieldObservable = viewTextField.rx.text.orEmpty.asObservable()
submitButton.rx.tap.withLatestFrom(Observable.combineLatest(textfieldObservable, tap ... )).flatMapLatest({
...
// this method will not be executed without tap on firstButton before tapping on submitButton
}
)
combineLatest
使用一个闭包,它接收的参数与它组合的可观察对象一样多。所以它会等待它组合的所有可观察对象在调用它的闭包之前提供一个值是有道理的。
但是,如果您可以为提供给 combineLatest
的每个可观察值找到一个默认值,您可以使用 startWith(_:)
强制它们具有初始值。
这是使用 nil
表示 item
和空字符串表示 text
的代码
let tapObservable: Observable<Item> = // ...
let textField: Observable<String> = // ...
let combined = Observable.combineLatest(
tapObservable.map { /* map everything to optional */ Optional.some([=10=]) }.startWith(nil),
textField.startWith("")
) { item, text in
// combine item and text
}
submitButton.rx.tap.withLatestFrom(combined)
Observable.combineLatest(...){...} 包含多个可观察值,但其中一些未发出。
combineLatest 仅当此方法中的所有 observable 都已发出时才会发出。
如何跳过未发出的可观察对象并发出 combineLatest?
let tap = firstButton.rx.tap.asObservable().map{ (_) -> Observable<Item> ...}
let textfieldObservable = viewTextField.rx.text.orEmpty.asObservable()
submitButton.rx.tap.withLatestFrom(Observable.combineLatest(textfieldObservable, tap ... )).flatMapLatest({
...
// this method will not be executed without tap on firstButton before tapping on submitButton
}
)
combineLatest
使用一个闭包,它接收的参数与它组合的可观察对象一样多。所以它会等待它组合的所有可观察对象在调用它的闭包之前提供一个值是有道理的。
但是,如果您可以为提供给 combineLatest
的每个可观察值找到一个默认值,您可以使用 startWith(_:)
强制它们具有初始值。
这是使用 nil
表示 item
和空字符串表示 text
let tapObservable: Observable<Item> = // ...
let textField: Observable<String> = // ...
let combined = Observable.combineLatest(
tapObservable.map { /* map everything to optional */ Optional.some([=10=]) }.startWith(nil),
textField.startWith("")
) { item, text in
// combine item and text
}
submitButton.rx.tap.withLatestFrom(combined)