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