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 线程池
将一个Observable转换成一个TimeInterval实体
实际用途
当我们有需求知道这次流的执行间隔的时候
当我们有需求转换其他时间单位到time的时候
TimeInterval不能作为基础流,只能是辅助二次转换
代码示例
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");
}
}
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");
}
}
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的功能分为两大模块,第一个模式是基础流,必须在第一时间提供基础操作源数据,基于基础流再进行二次拓展功能,
基于基础流来处理结果的模块需要放置在基础流的后面处理,执行的结果由最近的一次操作返回。
怎么区别一个字段是基础流还是拓展功能流的衔接,看图对比差异
如果一个流没有提供泛型方式来处理和返回,则是基础流,反之则是功能流字段,必须嵌套在基础流之后才能使用
如果你觉得对你有那么一点帮助,请点赞打赏是给我最大的动力
呀哈哈,有能力的朋友可以扫下面的打赏二维码↓↓↓
谢谢看官们↓↓↓