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
を呼び出すとストリームに値が流れています。