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
}
)
答案 0 :(得分:16)
combineLatest
使用一个闭包,它接受与可观察对象相结合的参数。所以它有意义等待它所结合的所有可观察量在它调用它的闭包之前提供一个值。
但是,如果您可以为combineLatest
提供的每个可观察对象找到一个sain默认值,则可以使用startWith(_:)
强制它们具有初始值。
这是使用nil
item
和text
let tapObservable: Observable<Item> = // ...
let textField: Observable<String> = // ...
let combined = Observable.combineLatest(
tapObservable.map { /* map everything to optional */ Optional.some($0) }.startWith(nil),
textField.startWith("")
) { item, text in
// combine item and text
}
submitButton.rx.tap.withLatestFrom(combined)