Použití předmětů
Typ Předmět<T> implementuje jak IObservable<T> , tak IObserver<T> v tom smyslu, že se jedná o pozorovatele i pozorovatele. Subjekt můžete použít k přihlášení k odběru všech pozorovatelů a následně k odběru subjektu back-endového zdroje dat. Tímto způsobem může subjekt fungovat jako proxy pro skupinu odběratelů a zdroj. Předměty můžete použít k implementaci vlastního pozorovatelného objektu s ukládáním do mezipaměti, ukládáním do vyrovnávací paměti a časovým posunem. Kromě toho můžete předměty použít k vysílání dat více odběratelům.
Ve výchozím nastavení objekty neprovádějí žádnou synchronizaci mezi vlákny. Nemají plánovač, ale spíše předpokládají, že veškerá serializace a gramatická správnost je zpracována volající předmětu. Subjekt jednoduše vysílá všem přihlášeným pozorovatelům v seznamu odběratelů bezpečných pro přístup z více vláken. Výhodou je snížení režie a zvýšení výkonu. Pokud ale chcete synchronizovat odchozí volání s pozorovateli pomocí plánovače, můžete k tomu použít metodu Synchronize.
Použití předmětů
V následujícím příkladu vytvoříme předmět, přihlásíme se k jeho odběru a pak použijeme stejný předmět k publikování hodnot pro pozorovatele. Tím zkombinujeme publikaci a odběr do stejného zdroje.
Kromě převzetí IObserver<T>, Subscribe metoda má také přetížení, které přijímá Action<T> pro onNext, což znamená, že akce bude provedena při každém publikování položky. V naší ukázce se při každém vyvolání OnNext zapíše položka do konzoly.
Subject<int> subject = new Subject<int>();
var subscription = subject.Subscribe(
x => Console.WriteLine("Value published: {0}", x),
() => Console.WriteLine("Sequence Completed."));
subject.OnNext(1);
subject.OnNext(2);
Console.WriteLine("Press any key to continue");
Console.ReadKey();
subject.OnCompleted();
subscription.Dispose();
Následující příklad znázorňuje povahu proxy a všesměrového vysílání Subject. Nejprve vytvoříme zdrojovou sekvenci, která každou 1 sekundu vytvoří celé číslo. Potom vytvoříme Objekt a předáme ho jako pozorovatel zdroji, aby obdržel všechny hodnoty vysílané touto sekvencí zdroje. Potom vytvoříme další dvě předplatná, tentokrát s předmětem jako zdrojem. Předplatná subSubject1
a subSubject2
pak obdrží jakoukoli hodnotu předanou subjektu (ze zdroje).
var source = Observable.Interval(TimeSpan.FromSeconds(1));
Subject<long> subject = new Subject<long>();
var subSource = source.Subscribe(subject);
var subSubject1 = subject.Subscribe(
x => Console.WriteLine("Value published to observer #1: {0}", x),
() => Console.WriteLine("Sequence Completed."));
var subSubject2 = subject.Subscribe(
x => Console.WriteLine("Value published to observer #2: {0}", x),
() => Console.WriteLine("Sequence Completed."));
Console.WriteLine("Press any key to continue");
Console.ReadKey();
subject.OnCompleted();
subSubject1.Dispose();
subSubject2.Dispose();
Různé typy předmětů
Typ Předmět<T> v knihovně Rx je základní implementací rozhraní ISubject<T> (můžete také implementovat rozhraní ISubject<T> a vytvořit vlastní typy předmětu). Existují i další implementace ISubject<T> , které nabízejí různé funkce. Všechny tyto typy ukládají některé (nebo všechny) hodnoty vložené do nich prostřednictvím OnNext a vysílají je zpět svým pozorovatelům. Tímto způsobem převedou horkou pozorovatelnou na studenou. To znamená, že pokud se přihlásíte k odběru některého z nich více než jednou (tj. Přihlášení k odběru –> Odhlášení odběru –> Opětovné přihlášení k odběru), zobrazí se znovu alespoň jedna ze stejných hodnot. Další informace o horkých a studených pozorovatelných sekvencích najdete v poslední části tématu Vytváření a přihlášení k odběru jednoduchých pozorovatelných sekvencí .
ReplaySubject ukládá všechny hodnoty, které publikoval. Proto při přihlášení k odběru automaticky obdržíte celou historii hodnot, které publikovala, i když vaše předplatné mohlo přijít po vysunutí určitých hodnot. BehaviorSubject je podobná hodnotě ReplaySubject s tím rozdílem, že se v ní uložila jenom poslední publikovaná hodnota. BehaviorSubject také vyžaduje při inicializaci výchozí hodnotu typu T. Tato hodnota je odeslána pozorovatelům, pokud subjekt ještě nepřijal žádnou jinou hodnotu. To znamená, že všichni předplatitelé obdrží okamžitě hodnotu při přihlášení k odběru, pokud předmět již skončil. AsyncSubject se podobá objektům Replay a Behavior, ale uloží pouze poslední hodnotu a publikuje ji pouze při dokončení sekvence. Typ AsyncSubject můžete použít v situacích, kdy je zdroj pozorovatelný horký a může se dokončit předtím, než se k němu může přihlásit jakýkoli pozorovatel. V tomto případě může AsyncSubject stále zadat poslední hodnotu a publikovat ji pro všechny budoucí předplatitele.