UniRx: Subject は IObserver であり IObservable でもある
Subject
の定義をみると次のようになっています。
public sealed class Subject<T> : ISubject<T>, IDisposable, IOptimizedObservable<T> { }
ISubject
の定義は、
public interface ISubject<TSource, TResult> : IObserver<TSource>, IObservable<TResult> { } public interface ISubject<T> : ISubject<T, T>, IObserver<T>, IObservable<T> { }
となっています。つまり、Subject
は IObserver
であり、IObservable
でもあります。
Subject
は、IObserver
であるのでストリームにデータを流す(OnNext)ことができます、。
using UniRx; using UniRx.Diagnostics; using UnityEngine; public class Main : MonoBehaviour { void Start() { var subject = new Subject<int>(); subject.Debug().Subscribe(); subject.OnNext(10); subject.OnNext(20); subject.OnNext(30); subject.OnCompleted(); } }
実行結果です。
OnSubscribe OnNext(10) OnNext(20) OnNext(30) OnCompleted()
また、Subject
は、IObservable
でもありますので Subscribe
の引数に渡すことができます。
using UniRx; using UnityEngine; public class Main : MonoBehaviour { void Start() { var subject = new Subject<int>(); subject.Debug().Subscribe(); Observable.Range(1, 3).Subscribe(subject); } }
実行結果です。
OnSubscribe OnNext(1) OnNext(2) OnNext(3) OnCompleted()