2010-05-14 6 views
37

Kann jemand die Unterschiede zwischen einem Observable und einem ConnectableObservable erklären? Die Rx Extensions-Dokumentation ist sehr spärlich und ich verstehe nicht, in welchen Fällen das ConnectableObservable nützlich ist.IConnectableObservables in Rx

Diese Klasse wird in den Replay/Prune-Methoden verwendet.

Antwort

60

Kurze Antwort:

IConnectableObservable stellt ein anhängigen heiß beobachtbar, die mit mehreren Teilnehmern gemeinsam genutzt werden können. Der Aufruf IConnectableObservable.Connect() bewirkt, dass der Wechsel zu heiß (abonniert zur kalten Quelle beobachtbaren)

Lange Antwort:

A kalt beobachtbaren (wie Observable.Range) Replays die Sequenz für jeden Teilnehmer. Es ist vergleichbar mit einer Stoppuhr, bei der jeder Teilnehmer seine eigene Stoppuhr hat. Der Teilnehmer startet die Stoppuhr durch Abonnieren, und die Stoppuhr stoppt (und setzt zurück), sobald der Beobachter aufhört zu beobachten.

Ein heiß beobachtbar teilt die Sequenz zwischen allen Abonnenten. Es ist analog zu einer Stoppuhr und alle Abonnenten erhalten die gleiche Zeitanzeige, unabhängig davon, wann sie anfingen zu schauen.

IObservable.Publish wandelt ein kalt beobachtbares in ein heißes beobachtbares um, gibt aber ein IConnectableObservable zurück. Dies ermöglicht Abonnenten, die (einzelne) Stoppuhr vor dem Start zu abonnieren. Durch Aufruf von IConnectableObservable.Connect() wird die Stoppuhr gestartet. Wenn Sie den Rückgabewert Connect() freigeben, wird die Stoppuhr angehalten.

Es ist erwähnenswert, dass einige beobachtbare Quellen von Natur aus heiß sind. Beispielsweise können Mausereignisse ausgelöst werden, unabhängig davon, ob wir sie abonniert haben oder nicht. Alles, was eine verbindbare Observable in diesem Szenario tun würde, ist ein einzelnes Ereignis-Abonnement zu teilen.