2013-02-25 11 views
15

Unter Verwendung von ReactiveCocoa gibt es zwei Möglichkeiten, um Abonnenten dieselben Werte von einem Signal zu erhalten, anstatt erneut auszulösen, welche Operation diese Werte generiert: Über RACReplaySubject oder RACMulticastConnection.Wann RACReplaySubject vs. RACMulticastConnection verwenden?

Hier sind die Header-Dokumentation für RACReplaySubject:

Eine Wiederholung unterliegt die Werte speichert sie (bis zu seiner definierten Kapazität) gesendet wird und sendet jene an neue Abonnenten. Es wird auch ein Fehler oder Abschluss wiedergegeben.

Und für RACMulticastConnection:

Eine Multicast-Verbindung kapselt die Idee von einem Abonnement eines Signal an viele Teilnehmer zu teilen. Dies ist am häufigsten erforderlich, wenn das Abonnement für das zugrunde liegende Signal Nebenwirkungen aufweist oder nicht mehr als einmal aufgerufen werden sollte.

Das Multicasted-Signal wird nur abonniert, wenn -[RACMulticastConnection connect] aufgerufen wird. Bis dahin werden keine Werte an signal gesendet. Siehe -[RACMulticastConnection autoconnect] für wie -[RACMulticastConnection connect] kann automatisch aufgerufen werden.

Beachten Sie, dass Sie RACMulticastConnection nicht manuell erstellen sollten. Verwenden Sie stattdessen -[RACSignal publish] oder -[RACSignal multicast:].

Kann jemand bieten einfache Richtlinien, wenn Sie RACReplaySubject oder RACMulticastConnection verwenden würde?

Antwort

32

Eigentlich schließen sie sich nicht gegenseitig aus und können sogar zusammen verwendet werden.

Der Hauptzweck der RACMulticastConnection ist ein Basissignal zu unterzeichnen, und dann per Multicast, dass Abonnement auf eine beliebige Anzahl von anderen Teilnehmern, ohne Auslösung der mehrfach Nebenwirkungen des Basissignals.

RACMulticastConnection erreicht dies durch Senden von Werten an eine private RACSubject, die über die Eigenschaft der Verbindung signal ausgesetzt ist. Teilnehmer hängen an das Subjekt an (das keine Nebenwirkungen verursacht), und die Verbindung leitet alle Ereignisse des Basissignals dorthin weiter.

Es gibt ein paar verschiedene Methoden, um eine Verbindung zu erstellen:

  • Die -publish eine Verbindung mit einem einfachen RACSubject schafft. Dieses Thema wird die vorherigen Werte für neue Abonnenten nicht wiedergeben.
  • Die Methode -multicast: erstellt eine Verbindung mit einem Thema Ihrer Wahl. Sie können sich hier für eine RACReplaySubject entscheiden.
  • Die -replay, -replayLast und -replayLazily Methoden sind Einrichtungen für eine Verbindung mit einem RACReplaySubject zu schaffen und dann auch automatisch connecting.

Im Zweifelsfall wird -replayLazily wahrscheinlich tun, was Sie wollen, weil es alle Werte speichert und löst nur Nebenwirkungen (oder beginnt jede Arbeit), wenn das zurückgegebene Signal ein Abonnement erhält.

+0

Ausgezeichnet, danke! – Poulsbo

+0

Wäre RACMulticastConnection für den Block "onMessage" eines WebSocket-Clients geeignet? Dann können die Teilnehmer entsprechend filtern, was mit unterschiedlichen Datentypen gemacht wird? –

+0

@MaxAlexander Sie können eine separate Frage dafür öffnen, da ich denke, dass ich es ohne weitere Details nicht beantworten kann. –

Verwandte Themen