使用开源库 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,且非常易于理解,非常好用.




目录
相关文章
|
机器学习/深度学习 数据采集 搜索推荐
多模型DCA曲线:如何展现和解读乳腺癌风险评估模型的多样性和鲁棒性?
多模型DCA曲线:如何展现和解读乳腺癌风险评估模型的多样性和鲁棒性?
528 1
|
存储 安全 Linux
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树
885 0
|
Java 数据库连接 mybatis
mybatismybatisPlus Update操作返回值不是影响行数
mybatismybatisPlus Update操作返回值不是影响行数
1315 0
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
国产AI神器Deepseek,本地离线使用教程!
国产AI神器Deepseek,本地离线使用教程!
1339 14
|
Kubernetes 应用服务中间件 nginx
debian11使用kubeadm安装k8s
debian11使用kubeadm安装k8s
343 1
|
存储 机器学习/深度学习 人工智能
香橙派——雕琢智能时代的瑰宝为AI而生(一)
香橙派——雕琢智能时代的瑰宝为AI而生(一)
488 0
|
人工智能 搜索推荐
影视与游戏行业AI视频制作的第3步:为角色生成说话视频
继 影视与游戏行业AI视频制作实战:第一步,角色形象设计的一致性以及影视与游戏行业AI视频制作实战:第二步,为角色生成个性化语音 后,实现角色生动化的下一步动作就是能让图像动起来。
|
定位技术
vue-baidu-map 自定义地图主题
vue-baidu-map 自定义地图主题
401 0
|
SQL 存储 监控
精通SQL:数据库查询与管理的全面指南
一、引言 在当今的数据驱动世界中,[数据库](https://www.iyxwzx.com/)技术无处不在,而SQL(结构化查询语言)则是数据库操作的基础
|
存储 文件存储 对象存储
一文读懂温冷数据存储的技术选型
在温存储或者冷存储领域,通常都是追求低成本和高密度。在满足这两个条件的情况下,性能越高越好。但不管怎么说,冷存储或者温存储,都应是绿色节能的。
1386 1