03.UniRx序列(Interval、TimeInterval、FrameInterval、FrameTimeInterval)

Interval

间隔一定的时间单位持续给订阅者通知信息,图解
03.UniRx序列(Interval、TimeInterval、FrameInterval、FrameTimeInterval)_第1张图片
示例代码

public class No03_Interval : MonoBehaviour
{
    void Start()
    {
        var intervalStream = Observable.Interval(TimeSpan.FromSeconds(3f), Scheduler.MainThread);
        
        var disposable = intervalStream.Subscribe(Next, Error, Complete);
        disposable.AddTo(this);
    }

    void Next(long times)
    {
        Debug.LogFormat("间隔3秒输出,第{0}次", times);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}

代码解析
Interval第一个参数是时间单位,Scheduler是调度器,表明这个Interval在哪个线程里面来执行
RX默认的调度器拥有的分支调度包括,4个

Scheduler.DefaultSchedulers.ConstantTimeOperations = Scheduler.Immediate;
Scheduler.DefaultSchedulers.TailRecursion = Scheduler.Immediate;
Scheduler.DefaultSchedulers.Iteration = Scheduler.CurrentThread;
Scheduler.DefaultSchedulers.TimeBasedOperations = MainThread;
Scheduler.DefaultSchedulers.AsyncConversions = Scheduler.ThreadPool;

Immediate 立即执行,当前正在运行程序的线程
CurrentThread 当前运行代码的Context所属的线程
MainThread 主线程
TreadPool 线程池

TimeInterval

将一个Observable转换成一个TimeInterval实体

实际用途
当我们有需求知道这次流的执行间隔的时候
当我们有需求转换其他时间单位到time的时候

TimeInterval不能作为基础流,只能是辅助二次转换
03.UniRx序列(Interval、TimeInterval、FrameInterval、FrameTimeInterval)_第2张图片
代码示例

public class No03_Interval : MonoBehaviour
{
    void Start()
    {
        var intervalStream = Observable.Interval(TimeSpan.FromSeconds(3f), Scheduler.MainThread);

        var timeInterval = intervalStream.TimeInterval();

        var disposable = timeInterval.Subscribe(Next, Error, Complete);
        disposable.AddTo(this);
    }

    void Next(TimeInterval<long> entity)
    {
        Debug.LogFormat("间隔{0}秒输出,第{1}次", entity.Interval, entity.Value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}
FrameInterval

将原始流转换成帧的计算方式来处理结果
03.UniRx序列(Interval、TimeInterval、FrameInterval、FrameTimeInterval)_第3张图片
代码示例

public class No03_Interval : MonoBehaviour
{
    void Start()
    {
        var intervalStream = Observable.Interval(TimeSpan.FromSeconds(3f), Scheduler.MainThread);

        var timeInterval = intervalStream.FrameInterval();

        var disposable = timeInterval.Subscribe(Next, Error, Complete);
        disposable.AddTo(this);
    }

    void Next(FrameInterval<long> entity)
    {
        Debug.LogFormat("间隔{0}帧输出,第{1}次", entity.Interval, entity.Value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}
FrameTimeInterval

既包括Frame也包括Time的实体转换结果
03.UniRx序列(Interval、TimeInterval、FrameInterval、FrameTimeInterval)_第4张图片
代码示例

public class No03_Interval : MonoBehaviour
{
    void Start()
    {
        var intervalStream = Observable.Interval(TimeSpan.FromSeconds(3f), Scheduler.MainThread);

        var frameInterval = intervalStream.FrameInterval();

        var timeInterval = frameInterval.FrameTimeInterval(true);

        var disposable = timeInterval.Subscribe(Next, Error, Complete);
        disposable.AddTo(this);
    }

    void Next(TimeInterval<FrameInterval<long>> entity)
    {
        var frameInterval = entity.Value;
        Debug.LogFormat("间隔{0}时间输出,间隔{1}帧输出,第{2}次", entity.Interval, frameInterval.Interval, frameInterval.Value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}
总结

UniRx的功能分为两大模块,第一个模式是基础流,必须在第一时间提供基础操作源数据,基于基础流再进行二次拓展功能,
基于基础流来处理结果的模块需要放置在基础流的后面处理,执行的结果由最近的一次操作返回。
怎么区别一个字段是基础流还是拓展功能流的衔接,看图对比差异

基础流
03.UniRx序列(Interval、TimeInterval、FrameInterval、FrameTimeInterval)_第5张图片
功能字段
03.UniRx序列(Interval、TimeInterval、FrameInterval、FrameTimeInterval)_第6张图片

如果一个流没有提供泛型方式来处理和返回,则是基础流,反之则是功能流字段,必须嵌套在基础流之后才能使用


如果你觉得对你有那么一点帮助,请点赞打赏是给我最大的动力
呀哈哈,有能力的朋友可以扫下面的打赏二维码↓↓↓
谢谢看官们↓↓↓

你可能感兴趣的:(UniRx)