Skip to content

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. マーブルダイアグラム

Switch のマーブルダイアグラム

外側の 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 が来たら即座に切り替えます。

特性SwitchMergeConcat
同時購読数1(最新のみ)全部1(順番に)
以前の購読即座に破棄維持完了まで維持
典型的な用途オートコンプリートイベント集約順序保証が必要な処理