5

Observable.combineLatest(...){...} 包含几个 observables,但其中一些 observables 没有发出。

combineLatest 仅在此方法中的所有可观察对象都已发出时才发出。

如何跳过未发出的 observables 并发出 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

}
)
4

1 回答 1

23

combineLatest使用一个闭包,它接收与组合可观察对象一样多的参数。因此,它会在调用闭包之前等待它组合的所有可观察对象提供一个值是有道理的。

但是,如果您可以为提供给 的每个 observables 找到一个默认值,则combineLatest可以使用startWith(_:)它们来强制它们具有初始值。

nil这就是代码使用foritem和空字符串的样子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)
于 2016-11-21T06:29:34.960 回答