UniRx: Subject とそれ以外のソースでのストリームの流れを眺める
- Subject にいくつかオペレータを敵賞して Subscribe する場合と
- Subject 以外のたとえば Range にいくつかオペレータを適用して Subscribe する場合
について、Observer にどのようにして値が流れるのか見ていきます。
まずは Subject から。
using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { private Subject<DateTime> _subject; void Start() { _subject = new Subject<DateTime>(); _subject .Select(e => e) .Subscribe(e => Debug.Log($"e = {e}")); } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { _subject.OnNext(DateTime.Now); } } }
Subscribe メソッドを呼ぶと、以下のように処理が進みます。
SelectObservable.Subscribe
=> SelectObservable.SubscribeCore
=> Subject.Subscribe
=> Observer を Subject が内部にもつ ListObserver に登録する
Subject の OnNext を呼びだすと、ListObserver に登録されている Observer の OnNext が呼ばれます。
このようにして Observer に値が通知されます。
次に Range の場合です。
using System; using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { Observable.Range(1, 3) .Select(e => e) .Subscribe(e => Debug.Log($"e = {e}")); } }
Subscribe をメソッドを呼ぶと、以下のように処理が進みます。
SelectObservable.Subscribe
=> SelectObservable.SubscribeCore
=> RangeObservable.Subscribe
=> RangeObservable.SubscribeCore の引数に渡された Observer の OnNext 呼び出す
Range の場合は、Subscribe を呼び出すとストリームに値が流れています。