2016-11-20 86 views
0

Observable.combineLatest(...){...}包含了幾個可觀測量,但其中一些可觀測量未被髮射。RxSwift。 CombineLatest。並非所有的可觀測量都發射了

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 

} 
) 
+0

空字符串沒有爲RX-斯威夫特鬆弛通道,如果你沒有在這裏找到答案:HTTP: //rxswift-slack.herokuapp.com/ – shallowThought

回答

10

combineLatest使用一個閉包,它接收儘可能多的參數,因爲它結合了observables。所以它是有道理的,它會等待它所結合的所有觀測值在它調用它的閉包之前提供一個值。

但是,如果您可以找到爲combineLatest提供的每個可觀察值的sain默認值,則可以使用startWith(_:)強制它們具有初始值。

這是代碼會是什麼樣使用nilitemtext

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) 
相關問題