2016-10-27 27 views
1

Ich bin irgendwie neu im reaktiven Muster und jetzt habe ich meine erste größere Frage.RXSwift eventlistener

Ich habe ein paar asynchrone Anfragen auf die reaktive Weise getan. Aber was ich jetzt tun möchte, ist ein "Eventlistener".

Ich habe ein Session Objekt, im Moment habe ich ein SessionEventListener Protokoll. Die Sitzung hat eine Liste von Listenern und informiert sie alle über eine erfolgreiche Anmeldung und eine Abmeldung. Diese Listener können sich anmelden und abmelden. Diese Sache möchte ich jetzt reaktiv machen.

Wie würden Sie das tun?


Meine Idee ist es, eine BehaviourSubject zu definieren:

public let loginEventBehaviourSubject = BehaviorSubject(value: true) 

jetzt kann ich senden OnNext wahr, wenn die Sitzung angemeldet, und falsch, wenn es wurde abgemeldet:

loginEventBehaviourSubject.onNext(true) // on login 
loginEventBehaviourSubject.onNext(false) // on logout 

Und meine "Zuhörer" können es abonnieren.

Aber ich würde Themen prefere für jede Veranstaltung haben:

public let loginEventBehaviourSubject = BehaviorSubject(value:) 
public let logoutEventBehaviourSubject = BehaviorSubject(value:) 

Aber dann brauche ich würde nicht die Bool. Kann ich eine Art "leeres" Subjekt machen, das nur "Ereignisse" feuert, ohne wirklich Daten zu übermitteln.

Und dann meine letzte Frage: Warum muss ich eine Instanz zum Initialisierer des Betreffs hinzufügen. Warum kann ich es nicht wie folgt erstellen: BehaviourSubject<Bool>()?

Antwort

1

Sie müssen dem Betreff des Verhaltens aufgrund seiner API einen Anfangswert geben. Tatsächlich definiert es BehaviorSubject<T>.value() Methode, die eine T zurückgibt. Und es wäre nicht sinnvoll, value ohne einen richtigen Anfangswert zu rufen. Im vorliegenden Fall denke ich, PublishSubject ist eine bessere Darstellung der Aufgabe zur Hand. Sie finden more documentation on the available kinds of subjects auf der reactivex Website.

Wenn Sie daran interessiert sind nur in den .next Fall Ihre Themen sind, können Sie let loginSubject = PublishSubject<Void>() tun (mit Verhalten unterliegen, könnten Sie BehaviorSubject<Void>(value:()) geschrieben haben) und der Lage sein, loginSubject.onNext() zu nennen.


Beachten Sie, dass die Verwendung eines beliebigen Objekts oft ein Anti-Pattern ist. In der Tat sind die Themen die meiste Zeit gedacht, um von der Imperativ zu der reaktiven Welt zu überbrücken, und Sie können sehr oft Dinge wie loginEventObservable als eine Kombination von anderen Observablen erstellen. Für weitere Informationen empfehle ich das Lesen To Use Subject Or Not To Use Subject?. Es ist mit der .Net Implementierung von Rx geschrieben, aber die Theorie bleibt gleich.