2016-11-20 10 views
0

Observable.combineLatest (...) {...} enthält mehrere Observablen, aber einige dieser Observablen wurden nicht emittiert.RxSwift. CombateLatest. Nicht alle Observablen ausgegeben

combineLatest sendet nur aus, wenn alle Observablen in dieser Methode emittiert wurden.

Wie nicht emittierte Observablen zu überspringen und CombineLatest emittieren?

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

Es gibt einen Slack-Kanal ist Sie eine Antwort nicht finden, hier für RX-Swift, für den Fall aussehen würde: http: //rxswift-slack.herokuapp.com/ – shallowThought

Antwort

10

combineLatest verwendet einen Verschluss, der in so viele Argumente übernimmt, wie es Observablen kombiniert. Es macht also Sinn, dass es darauf wartet, dass alle Observablen, die es kombiniert, einen Wert liefern, bevor es seine Schließung nennt.

Aber wenn Sie von sain Standardwerte für jede der combineLatest zur Verfügung gestellten Observablen finden können, könnten Sie startWith(_:) auf sie verwenden, um sie zu zwingen, einen Anfangswert zu haben.

Dies ist, was der Code wie mit nil für item und die leere Zeichenfolge für 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)