2016-04-24 8 views
3
let stream = PublishSubject<Int>() 
let trigger = PublishSubject<Void>() 

stream.sample(trigger).subscribeNext { value in print("value \(value)") } 

stream.onNext(5) 
trigger.onCompleted() 

Das obige gibt "Wert 5" an die Konsole aus. Ich finde das überraschend, da ich onNext() nie am Trigger angerufen habe.`sample` wird ausgelöst, wenn sie abgeschlossen ist. Wie vermeide ich?

In meinem Fall stellt trigger eine Sicherungstaste rx_tap dar und die stream stellt einen gültigen Eingang dar, der gespeichert werden soll. Mein Problem ist, dass der Stream gespeichert wird, wenn der Trigger (bei Zerstörung) abgeschlossen ist, auch wenn er nicht angezapft wurde.

Antwort

1

Nun, sample auslöst onCompleted obwohl
Sie können es hier sehen: http://reactivex.io/documentation/operators/sample.html

Es wie in Ihrem Fall erwartet funktioniert.

Normalerweise, wenn Sie observers in DisposeBag hinzufügen, wird es entsorgt, wenn der Beutel entsorgt wird.
Zum Beispiel: wenn Viewcontrollers oder Viewmodel deinit ed ist ...

So wird die Lösung onCompleted nicht nur rufen Sie die observers

stream.sample(trigger) 
     .subscribeNext { value in print("value \(value)") } 
     .addDisposableTo(disposeBag) 

stream.onNext(5) 
zu entsorgen
Verwandte Themen