RxSwift。结合最新。并不是所有的 observables 都发出了

Posted

技术标签:

【中文标题】RxSwift。结合最新。并不是所有的 observables 都发出了【英文标题】:RxSwift. CombineLatest. Not all observables emitted 【发布时间】:2016-11-20 17:30:24 【问题描述】:

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

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


)

【问题讨论】:

RX-Swift 有一个 Slack 频道,以防您在这里找不到答案:rxswift-slack.herokuapp.com 【参考方案1】:

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($0) .startWith(nil), 
  textField.startWith("")
)  item, text in
  // combine item and text


submitButton.rx.tap.withLatestFrom(combined)

【讨论】:

以上是关于RxSwift。结合最新。并不是所有的 observables 都发出了的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 结合异构的 observables

如何将多个驱动程序与 RxSwift 正确组合?

如果全部都不为空,则组合文本字段结果 RxSwift

结合 Alamofire 和 RxSwift

RxSwift:结合不同类型的可观察对象和映射结果

RxSwift使用小记