文章系列
《ReactiveCocoa 概述》
《RACSignal》
《RACDisposable》
《RACSubject、RACReplaySubject(内附冷信号和热信号的区别)》
《集合RACTuple、RACSequence》
《RAC 中的通知、代理、KVO, 基本事件、方法的监听》
《rac_liftSelector》
《RACMulticastConnection》
《RACCommand》
《RAC - 核心方法bind》
《RAC - 定时器》
《RACScheduler》
《RAC - 点击获取验证码 demo》
《RAC - 映射(Map & flattenMap)》
《RAC信号操作解释合集》
《RAC - 信号的生命周期》
注: 开发中过程中的使用,可参见实例
1. 初始化
方法一:本质是调用方法二
+ (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler;
方法一:
+ (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler withLeeway:(NSTimeInterval)leeway;
interval
: 每次执行之前等待的时间.
scheduler
: 定时器执行所在的线程, 可参见《RACScheduler》.
leeway
: 指的是一个期望的容忍时间,将它设置为1秒,意味着系统有可能在定时器时间到达的前1秒或者后1秒才真正触发定时器.在调用时推荐设置一个合理的 leeway 值,需要注意,就算指定 leeway 值为 0,系统也无法保证完全精确的触发时间,只是会尽可能满足这个需求.
2. 源码分析
1.RACQueueScheduler 的 的after 方法才是定时器的实现.
2.本质封装的GCD 的定时器.
3.after 方法的block 就是外界传进来的block.
4.return 一个disposable 对象, [disposable dispose]时, 释放定时器. 也可理解成当结束订阅该信号时, 释放定时器.
3. 示例代码
- (void)RAC_timerTest {
// 创建定时器信号, 在主线程, 每1 秒执行一次.
RACSignal *timerSignal = [RACSignal interval:1 onScheduler:RACScheduler.mainThreadScheduler];
// 订阅该信号
RACDisposable *disposable = [timerSignal subscribeNext:^(id _Nullable x) {
NSLog(@"timer: %@", x);
}];
// 在需要时, 释放定时器 (模拟3s 之后释放定时器)
[RACScheduler.mainThreadScheduler after:[NSDate dateWithTimeIntervalSinceNow:3] schedule:^{
[disposable dispose];
}];
}
打印结果:
.End