過去記事インデックス
- Reactive Extensions再入門 その1
- Reactive Extensions再入門 その2「IObservableインターフェースとIObserverインターフェース」
- Reactive Extensions再入門 その3「IObservableのファクトリメソッド」
- Reactive Extensions再入門 その4「Timer系のファクトリメソッド」
- Reactive Extensions再入門 その5「HotとCold」
- Reactive Extensions再入門 その6「HotなIObservableを作成するファクトリ」
- Reactive Extensions再入門 その7「LINQスタイルの拡張メソッド」
- Reactive Extensions再入門 その8「SkipとTakeメソッド」
- Reactive Extensions再入門 その9「Skip + Take + Repeat = ドラッグ」
- Reactive Extensions再入門 その10「Doメソッド」
- Reactive Extensions再入門 その11「Catchメソッド」
- Reactive Extensions再入門 その12「Finallyメソッドとリソース解放」
- Reactive Extensions再入門 その13「最後の値を取得するLatestとMostRecentメソッド」
- Reactive Extensions再入門 その14「Nextメソッド」
- Reactive Extensions再入門 その15「To*****系メソッド」
- Reactive Extensions再入門 その16「最大、最少、平均を求めるメソッド」
- Reactive Extensions再入門 その17「集計するメソッド」
- Reactive Extensions再入門 その18「CountメソッドとLongCountメソッド」
- Reactive Extensions再入門 その19「AnyメソッドとAllメソッド」
- Reactive Extensions再入門 その20「GroupByメソッドでグルーピングしてみよう」
- Reactive Extensions再入門 その21「GroupByUntilメソッド」
- Reactive Extensions再入門 その22「単一の値を取得するメソッド」
- Reactive Extensions再入門 その23「重複を排除するメソッド」
- Reactive Extensions再入門 その24「単一の値を取得するメソッド その2」
- Reactive Extensions再入門 その25「値をまとめるBufferメソッド」
- Reactive Extensions再入門 その26「値をまとめるWindowメソッド」
- Reactive Extensions再入門 その27「時間でフィルタリング?Sampleメソッド」
- Reactive Extensions再入門 その28「落ち着いたら流すThrottleメソッド」
- Reactive Extensions再入門 その29「値を指定した時間だけ遅延させるDelayメソッド」
- Reactive Extensions再入門 その30「もう待ちきれない!を表現するTimeoutメソッド」
- Reactive Extensions再入門 その31「時間に関する情報を付与するTimestampとTimeIntervalメソッド」
- Reactive Extensions再入門 その32「型変換を行うCastとOfTypeメソッド」
- Reactive Extensions再入門 その33「シーケンスの最後を起点にSkipとTake」
- Reactive Extensions再入門 その34「ダメなら次の人!を実現するOnErrorResumeNextメソッド」
- Reactive Extensions再入門 その35「駄目ならやり直す!を実現するRetryメソッド」
- Reactive Extensions再入門 その36「ColdからHotへ!Publishメソッドと参照カウンタ?RefCountメソッド」
- Reactive Extensions再入門 その37「ColdからHotへ!その他のPublish系メソッド」
- Reactive Extensions再入門 その38「ColdからHotへ!その他のPublish系メソッド2」
はじめに
Reactive Extensionsには、これまでのサンプル内で使ってきたように様々なSubject系のクラスがあります。Reactive Extensions再入門 その14「Nextメソッド」でBehaviorSubject
Subjectクラス
Subject
var source = new Subject<int>(); // 購読1 Console.WriteLine("# Subscribe1"); source.Subscribe( i => Console.WriteLine("Subscribe1#OnNext: {0}", i), ex => Console.WriteLine("Subscribe1#OnError: {0}", ex), () => Console.WriteLine("Subscribe1#OnCompleted")); // 購読2 Console.WriteLine("# Subscribe2"); source.Subscribe( i => Console.WriteLine("Subscribe2#OnNext: {0}", i), ex => Console.WriteLine("Subscribe2#OnError: {0}", ex), () => Console.WriteLine("Subscribe2#OnCompleted")); // 値の発行〜完了 Console.WriteLine("OnNext(1)"); source.OnNext(1); Console.WriteLine("OnNext(2)"); source.OnNext(2); Console.WriteLine("OnNext(3)"); source.OnNext(3); Console.WriteLine("OnCompleted()"); source.OnCompleted();
Subject
# Subscribe1 # Subscribe2 OnNext(1) Subscribe1#OnNext: 1 Subscribe2#OnNext: 1 OnNext(2) Subscribe1#OnNext: 2 Subscribe2#OnNext: 2 OnNext(3) Subscribe1#OnNext: 3 Subscribe2#OnNext: 3 OnCompleted() Subscribe1#OnCompleted Subscribe2#OnCompleted
Subject
var source = new Subject<int>(); // 購読 Console.WriteLine("# Subscribe"); source.Subscribe( i => Console.WriteLine("Subscribe1#OnNext: {0}", i), ex => Console.WriteLine("Subscribe1#OnError: {0}", ex), () => Console.WriteLine("Subscribe1#OnCompleted")); // 例外 source.OnError(new Exception("Error!!"));
実行結果を以下に示します。
# Subscribe Subscribe1#OnError: System.Exception: Error!!
AsyncSubjectクラス
ここでは、AsyncSubject
var source = new AsyncSubject<int>(); // 購読 Console.WriteLine("# Subscribe1"); source.Subscribe( i => Console.WriteLine("Subscribe1#OnNext: {0}", i), ex => Console.WriteLine("Subscribe1#OnError: {0}", ex), () => Console.WriteLine("Subscribe1#OnCompleted")); // 値の発行〜完了 Console.WriteLine("OnNext(1)"); source.OnNext(1); Console.WriteLine("OnNext(2)"); source.OnNext(2); Console.WriteLine("OnNext(3)"); source.OnNext(3); Console.WriteLine("OnCompleted()"); source.OnCompleted(); // OnCompleted後の購読 Console.WriteLine("# Subscribe2"); source.Subscribe( i => Console.WriteLine("Subscribe2#OnNext: {0}", i), ex => Console.WriteLine("Subscribe2#OnError: {0}", ex), () => Console.WriteLine("Subscribe2#OnCompleted"));
実行結果を以下に示します。
# Subscribe1 OnNext(1) OnNext(2) OnNext(3) OnCompleted() Subscribe1#OnNext: 3 Subscribe1#OnCompleted # Subscribe2 Subscribe2#OnNext: 3 Subscribe2#OnCompleted
OnCompletedメソッドが呼ばれたタイミングでの値の発行と、OnCompletedメソッドが呼ばれた後のSubscribeでも値が発行されていることが確認できます。
ReplaySubjectクラス
ここでは、ReplaySubject
var source = new ReplaySubject<int>(); // 購読 Console.WriteLine("# Subscribe1"); source.Subscribe( i => Console.WriteLine("Subscribe1#OnNext: {0}", i), ex => Console.WriteLine("Subscribe1#OnError: {0}", ex), () => Console.WriteLine("Subscribe1#OnCompleted")); // 値の発行〜完了 Console.WriteLine("OnNext(1)"); source.OnNext(1); Console.WriteLine("OnNext(2)"); source.OnNext(2); Console.WriteLine("OnNext(3)"); source.OnNext(3); Console.WriteLine("OnCompleted()"); source.OnCompleted(); // OnCompleted後の購読 Console.WriteLine("# Subscribe2"); source.Subscribe( i => Console.WriteLine("Subscribe2#OnNext: {0}", i), ex => Console.WriteLine("Subscribe2#OnError: {0}", ex), () => Console.WriteLine("Subscribe2#OnCompleted"));
実行結果を以下に示します。
# Subscribe1 OnNext(1) Subscribe1#OnNext: 1 OnNext(2) Subscribe1#OnNext: 2 OnNext(3) Subscribe1#OnNext: 3 OnCompleted() Subscribe1#OnCompleted # Subscribe2 Subscribe2#OnNext: 1 Subscribe2#OnNext: 2 Subscribe2#OnNext: 3 Subscribe2#OnCompleted
最初の購読から値の発行、完了通知の流れではSubject