Switch
1. 概要
Switch は、Observable<Observable<T>>(Observable の Observable)を受け取り、最新の内部 Observable のみを購読するオペレーターです。
外側の Observable が新しい内部 Observable を発行するたびに、以前の内部 Observable の購読を解除し、新しい内部 Observable に切り替えます。結果として、常に最新の内部 Observable からの要素のみが下流へ流れます。
2. シグネチャ
最新の内部 Observable に切り替える
csharp
public static Observable<T> Switch<T>(this Observable<Observable<T>> sources)外側の Observable が発行する内部 Observable のうち、最新のものだけを購読します。新しい内部 Observable が発行されると、前の購読は自動的に破棄されます。
csharp
observableOfObservables.Switch()3. マーブルダイアグラム
外側の Observable が新しい内部 Observable を発行するたびに、以前の内部 Observable の購読が解除され、新しい内部 Observable の要素のみが下流へ流れます。
4. サンプルコード
csharp
using R3;
var outer = new Subject<Observable<string>>();
outer.Switch()
.Subscribe(x => Console.WriteLine(x));
var inner1 = new Subject<string>();
var inner2 = new Subject<string>();
outer.OnNext(inner1); // inner1 を購読開始
inner1.OnNext("A"); // 出力: A
inner1.OnNext("B"); // 出力: B
outer.OnNext(inner2); // inner1 の購読を解除し、inner2 を購読開始
inner1.OnNext("C"); // 出力なし(inner1 は購読解除済み)
inner2.OnNext("X"); // 出力: X
inner2.OnNext("Y"); // 出力: Y検索のオートコンプリートでの典型的な使い方:
csharp
using R3;
// 入力テキストが変わるたびに新しい検索 Observable を生成し、
// 最新の検索結果のみを使用する
searchTextObservable
.Select(query => SearchApi(query)) // Observable<Observable<string[]>> になる
.Switch() // 最新の検索結果のみを購読
.Subscribe(results => UpdateUI(results));5. 補足
Merge との違い
Merge はすべての内部 Observable を同時に購読し続け、すべての要素を下流へ流します。Switch は最新の内部 Observable のみを購読し、以前のものは破棄します。
Concat との違い
Concat は前の内部 Observable が完了してから次を購読します。Switch は完了を待たずに、新しい内部 Observable が来たら即座に切り替えます。
| 特性 | Switch | Merge | Concat |
|---|---|---|---|
| 同時購読数 | 1(最新のみ) | 全部 | 1(順番に) |
| 以前の購読 | 即座に破棄 | 維持 | 完了まで維持 |
| 典型的な用途 | オートコンプリート | イベント集約 | 順序保証が必要な処理 |