UniRx学习笔记(二)

今天学习了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"); } }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值