今天学习了ReplaySubject<T>,下面将结合代码讲解。
ReplaySubject<T>
ReplaySubject<T>的特点是:当ReplaySubject<T>执行OnNext()操作时,数据T会被先放入缓存区。如果ReplaySubject<T>没有订阅者,那么数据T会一直存放在缓存区,直到ReplaySubject<T>被订阅时,向订阅者发射数据。 从下图中可以看出:无论什么时候时候执行Subscribe()操作,一定能够得到来自ReplaySubject<T>的数据。 看下实例代码1。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
public class ChapterTwoCodeSample1 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
ReplaySubject<string> replaySubject1 = new ReplaySubject<string>();
//将"send message1"储存至缓存区
replaySubject1.OnNext("send message1");
//将"send message1"储存至缓存区
replaySubject1.OnNext("send message2");
//Subscribe(Action<string> onNext)
//replaySubject1被订阅,发送所有的数据
replaySubject1.Subscribe(print);
//replaySubject1已被订阅,不会在往缓存区中存放数据
replaySubject1.OnNext("send message3");
}
}
输出结果: send message1 send message2 send message3
ReplaySubject<T>的构造参数
在构造replaySubject1 时UniRx提供的3个可选的参数,但我主要介绍前2个参数,scheuler会在之后介绍。:
- int bufferSize
- System.Timespan window
- IScheduler scheuler
对于bufferSize,这个参数设定缓存区域的大小(缓存区是一个队列),请看实例代码2:
public class ChapterTwoCodeSample2 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//设定缓存区大小为2
ReplaySubject<string> replaySubject2 = new ReplaySubject<string>(2);
//将"send message1"储存至缓存区
replaySubject2.OnNext("send message1");
//将"send message1"储存至缓存区
replaySubject2.OnNext("send message2");
//将"send message1"储存至缓存区
replaySubject2.OnNext("send message3");
//Subscribe(Action<string> onNext)
//replaySubject1被订阅,发送所有的数据
replaySubject2.Subscribe(print);
}
}
输出结果: send message2 send message3
对于Timespan window,在执行Subscribe()时,replaySubject会先检查buffer里的每个值的生成时间与当前时间的时间差。如果时间差小于window的数据保留,否则就从buffer里移除,然后发射buffer中的值,请看实例代码3。
public class ChapterTwoCodeSample3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//replaySubject3被订阅1.5s后发射数据
ReplaySubject<string> replaySubject3 = new ReplaySubject<string>(TimeSpan.FromSeconds(1.5f));
//将"send message1"寿命2s
replaySubject3.OnNext("send message1");
Thread.Sleep(TimeSpan.FromSeconds(1f));
//将"send message2"寿命1s
replaySubject3.OnNext("send message2");
Thread.Sleep(TimeSpan.FromSeconds(1f));
//将"send message3"寿命0s
replaySubject3.OnNext("send message3");
//Subscribe(Action<string> onNext)
//replaySubject3被订阅,寿命大于1.5s的值将被移除
replaySubject3.Subscribe(print);
replaySubject3.OnNext("send message4");
}
}
1143

被折叠的 条评论
为什么被折叠?



