RAC - 定时器

文章系列
《ReactiveCocoa 概述》
《RACSignal》
《RACDisposable》
《RACSubject、RACReplaySubject(内附冷信号和热信号的区别)》
《集合RACTuple、RACSequence》
《RAC 中的通知、代理、KVO, 基本事件、方法的监听》
《rac_liftSelector》
《RACMulticastConnection》
《RACCommand》
《RAC - 核心方法bind》
《RAC - 定时器》
《RACScheduler》
《RAC - 点击获取验证码 demo》
《RAC - 映射(Map & flattenMap)》
《RAC信号操作解释合集》
《RAC - 信号的生命周期》

注: 开发中过程中的使用,可参见实例

《RAC - 点击获取验证码 demo》

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]时, 释放定时器. 也可理解成当结束订阅该信号时, 释放定时器.


RACQueueScheduler 的after 方法才是定时器的实现方法

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

你可能感兴趣的:(RAC - 定时器)