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 > ) {
[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 > ) {
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 = ;
if (flag == )
{
// 暂停时间线
[timeline pause];
flag = !flag;
} // GCD 延时 5s 后恢复时间线
[self delayTime: 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 = ;
if (flag == ) {
flag = !flag; [timeline skipForwardSeconds:3.0];
}
}
}; // 开启定时器
[timeline start];

心得:

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

使用开源库 EasyTimeline 操作定时器 NSTimer的更多相关文章

  1. 使用开源库MagicalRecord操作CoreData

      1. 将 MagicalRecord 文件夹拖入到工程文件中,引入 CoreData.frame 框架 2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h 注: ...

  2. 使用开源库 MagicalRecord 操作 CoreData

    MagicalRecord  https://github.com/magicalpanda/MagicalRecord 注意:  MagicalRecord 在 ARC 下运作,Core Data ...

  3. Android 使用SwipeActionAdapter开源库实现简单列表的左右滑动操作

    我们做listview左右滑动操作时,一般中情况下,都是像QQ那样,左滑弹出操作菜单(删除.编辑),然后选择菜单操作: 这样的效果不可谓不好,算是非常经典. 另外,有少数的APP,尤其是任务管理类的A ...

  4. 开源库Magicodes.ECharts使用教程

    目录 1    概要    2 2    Magicodes.ECharts工作原理    3 2.1    架构说明    3 2.1.1    Axis    4 2.1.2    CommonD ...

  5. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  6. Java下好用的开源库推荐

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文想介绍下自己在Java下做开发使用到的一些开源的优秀编程库,会不定 ...

  7. GitHub上那些值得一试的JAVA开源库--转

    原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...

  8. 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发

    概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...

  9. 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发

    [原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http: ...

随机推荐

  1. 旁门左道通过JS与纯CSS实现显示隐藏层

    想必大家在开发前端页面时,肯定少不了显示隐藏层这一技术点.那么我简单粗暴地总结了以下两个小demo. 要实现该截图的功能:鼠标移动到我的好友这个选项卡时,灰色的隐藏层就会出现.

  2. day7 面向对象class()学习

        面向过程 VS 面向对象     编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓 ...

  3. 【Codechef】Chef and Bike(二维多项式插值)

    something wrong with my new blog! I can't type matrixs so I come back. qwq 题目:https://www.codechef.c ...

  4. forms.ModelForm 与 forms.Form

    1. 首先 两者都是forms里的常用类. 2. 这两个类在应用上是有区别的.一般情况下,如果要将表单中的数据写入数据库或者修改某些记录的值,就要让表单类继承ModelForm; 如果提交表单后 不会 ...

  5. 【转】关于Jmeter3.0,你必须要知道的5点变化

    2016.5.18日,Apache 发布了jmeter 3.0版本,本人第一时间上去查看并下载使用了,然后群里或同事都会问有什么样变化呢?正好在网上看到一遍关于3.0的文章,但是是英文的.这里翻译一下 ...

  6. 第一个iOS程序:Hello iOS

    今天我们来创建第一个iOS程序:Hello iOS!不需要写任何代码就能实现:

  7. HTTP协议--请求与响应

    1.简介 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW 中使用的是HT ...

  8. java技术选型

    综述 JDK版本:JDK8/JDK7 + OracleJDK/OpenJDK Java开发框架:Spring Boot/Spring + Hibernate/MyBatis 前后端分离:单页应用/模板 ...

  9. Windows Installer服务总是自动关闭导致无法安装在win10上安装英伟达显卡驱动的解决方案

    你可以依次点击"开始→程序→附件→命令提示符",键入:msiexec /unregister, 然后再键入msiexec /regserver.应该就能解决. 更多的参考:How ...

  10. ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

      ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...