• 使用开源库 EasyTimeline 操作定时器 NSTimer


    EasyTimeline

    https://github.com/mmislam101/EasyTimeline

    Sometimes you need things to happen at specific times and things.

    When it's just an event 2.0 seconds later, a performSelector:withObject:afterDelay: is perfect.

    If it gets a little more complex where you need something happening ever 3.0 seconds, a quick implementation of NSTimer is good.

    But what if you want something to happen every 2 seconds and then at the 7th second something else to happen. Or if you want to pause everything for a while and then resume later?

    有时候,你需要确保一些事件在指定的时间点上发生.

    仅仅只是想在第2秒的时候触发一个事件,这个方法performSelector:withObject:afterDelay:就够了.

    稍微复杂点,你需要事件每3秒触发一次,这个NSTimer也很好用.

    但是呢,如果你想着,这个事件每2秒触发一次,然后在第7秒的时候又触发一次,或者这么说吧,你想停止这个定时器一会儿,之后在激活它,继续运行下去,咋搞?

    简单的分析下图:

    Tick Events 为定时触发的事件,对应于tickPeriod.

    Special Events 为特殊触发的事件,由方法addEvent:添加,使得事件在指定的时间点上运行.

    That's where Easy Timeline comes into play.

    别急,这就是 Easy Timeline 要干的活,哥们.

    注:EasyTimeline运行于ARC下,本人研究其demo后,进行简单的分享

    1. 下载源码,把 EasyTimeline 文件夹拖入工程项目中,引入头文件 EasyTimeline.h

    2. 使用详情

    每0.5s触发一次事件

        // 初始化定时器
        EasyTimeline  *timeline = [[EasyTimeline alloc] init];
        
        // 设置定时器为永久启动
        timeline.willLoop = YES;
        
        // 设置触发事件的最高时长(开启willLoop后此设置的值无效,大于0即可)
        timeline.duration = 0.1;
        
        // 触发事件的事件间隔为 0.5 s
        timeline.tickPeriod = 0.5;
        
        // 事件触发后会进入如下block
        timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
            NSLog(@"%f", time);
        };
        
        // 开启定时器
        [timeline start];

    每0.5s触发一次事件,5s后暂停定时器

    注:一旦暂停后,所有的这个时间线上的事件都暂停了

        // 初始化定时器
        EasyTimeline  *timeline = [[EasyTimeline alloc] init];
        
        // 设置定时器为永久启动
        timeline.willLoop = YES;
        
        // 设置触发事件的最高时长(开启willLoop后此设置的值无效,大于0即可)
        timeline.duration = 0.1;
        
        // 触发事件的事件间隔为 0.5 s
        timeline.tickPeriod    = 0.5;
        
        // 事件触发后会进入如下block
        timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
            NSLog(@"%f", time);
            
            // 5秒后暂停定时器
            if (time > 5) {
                [timeline pause];
            }
        };
        
        // 开启定时器
        [timeline start];

    每0.5s触发一次事件,5s设置定时器为每3.0s触发一次事件

        // 初始化定时器
        EasyTimeline  *timeline = [[EasyTimeline alloc] init];
        
        // 设置定时器为永久启动
        timeline.willLoop = YES;
        
        // 设置触发事件的最高时长(开启willLoop后此设置的值无效,大于0即可)
        timeline.duration = 0.1;
        
        // 触发事件的事件间隔为 0.5 s
        timeline.tickPeriod    = 0.5;
        
        // 事件触发后会进入如下block
        timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
            
            NSLog(@"%f", time);
            
            // 5秒后设置事件时间间隔为 3.0 s
            if (time > 5) {
                timeline.tickPeriod = 3.0;
            }
        };
        
        // 开启定时器
        [timeline start];

    每4.0s触发一次事件,第5.0s时触发一次事件

        // 初始化定时器
        EasyTimeline  *timeline = [[EasyTimeline alloc] init];
        
        // 设置定时器为永久启动
        timeline.willLoop = YES;
        
        // 设置触发事件的最高时长(开启willLoop后此设置的值无效,大于0即可)
        timeline.duration = 0.1;
        
        // 触发事件的事件间隔为 4.0 s
        timeline.tickPeriod    = 4.0;
        
        // 事件触发后会进入如下block
        timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
            
            NSLog(@"%f", time);
        };
        
        // 在时间线上的第 5.0s 时插入一个事件
        [timeline addEvent:[EasyTimelineEvent eventAtTime:5.0 withEventBlock:^(EasyTimelineEvent *event, EasyTimeline *timeline) {
            NSLog(@"Y.X.");
        }]];
        
        // 开启定时器
        [timeline start];

    每0.5s触发一次事件,第5.0s时停止,延时5.0s后继续触发事件

    #pragma mark - GCD延时
    - (void)delayTime:(int64_t)seconds inQueue:(dispatch_queue_t)queue
                block:(void (^)(dispatch_queue_t queue))block
    {
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC);
        dispatch_after(popTime, queue, ^(void){
            block(queue);
        });
    }
    
        // 初始化定时器
        EasyTimeline  *timeline = [[EasyTimeline alloc] init];
        
        // 设置定时器为永久启动
        timeline.willLoop = YES;
        
        // 设置触发事件的最高时长(开启willLoop后此设置的值无效,大于0即可)
        timeline.duration = 0.1;
        
        // 触发事件的事件间隔为 0.5 s
        timeline.tickPeriod    = 0.5;
        
        // 事件触发后会进入如下block
        timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
            
            NSLog(@"%f", time);
            
            if (time > 5.0)
            {
                static int flag = 0;
                if (flag == 0)
                {
                    // 暂停时间线
                    [timeline pause];
                    flag = !flag;
                }
    
                // GCD 延时 5s 后恢复时间线
                [self delayTime:5 inQueue:dispatch_get_main_queue() block:^(dispatch_queue_t queue) {
                    [timeline resume];
                }];
                
            }
        };
        
        // 开启定时器
        [timeline start];

    每1.0s触发一次事件,第5秒时跳过去3.0s(本人试验过,不知道有啥用)

        // 初始化定时器
        EasyTimeline  *timeline = [[EasyTimeline alloc] init];
        
        // 设置定时器为永久启动
        timeline.willLoop = YES;
        
        // 设置触发事件的最高时长(开启willLoop后此设置的值无效,大于0即可)
        timeline.duration = 0.1;
        
        // 触发事件的事件间隔为 1.0 s
        timeline.tickPeriod    = 1.0;
        
        // 事件触发后会进入如下block
        timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
            
            NSLog(@"%f", time);
            
            if (time > 5.0) {
                static int flag = 0;
                if (flag == 0) {
                    flag = !flag;
                    
                    [timeline skipForwardSeconds:3.0];
                }
            }
        };
        
        // 开启定时器
        [timeline start];

    心得:

    该时间线可以暂停,可以恢复,可以在指定的时间点上触发事件,在运行中可以随时调整触发事件的时间间隔,完爆系统自带的NSTimer,且非常易于理解,非常好用.

  • 相关阅读:
    numpy 支持切片取值,使用ix_ 也可以取到
    pyinstaller 打包文件成 exe
    matplotlib 直方图概率不为1
    小提琴图 ValueError: object arrays are not supported
    pip 生成 requirements.txt
    CF1515E(连续段 dp)
    Lg7 月赛(构造,树形 dp)
    [省选联考 2020 A 卷] 组合数问题 题解报告
    愤怒的小 N 题解报告
    CF32E 题解
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3620829.html
Copyright © 2020-2023  润新知