1 在开发的过程中,定时器是一个必不可少的功能,我们可以用NStimer,
CADisplayLink,GCD Timer
CADisplayLink 是一个保持屏幕同频率的计时器类,一般用在动画或者视频的渲染,不是作为定时器事件来用的。
NSTimer不多讲,这个刚入门的iOS开发者用的大多都是这个,而且大部分情况下能够实现我们的功能。比如取消已经在队列的任务。这个就需要用到GCD Timer了
而且GCD相对于NStimer有很多优势
1
GCD的定时器和NSTimer是不一样的,NSTimer受RunLoop影响,但是GCD的定时器不受影响,因为RunLoop也是基于GCD的
2
dispatch_source_t支持的类型比较多,不仅仅是timer,还有以下类型
1 Timer dispatch source:定期产生通知
2 Signal dispatch source
:UNIX信号到达时产生通知
3 Descriptor dispatch source
:各种文件和socket操作的通知
数据可读
数据可写
文件在文件系统中被删除、移动、重命名
文件元数据信息改变
4 Process dispatch source
:进程相关的事件通知
当进程退出时
当进程发起fork或exec等调用
信号被递送到进程
5 Mach port dispatch source
:Mach相关事件的通知
6
Custom dispatch source
:
学会GCD Timer你不会吃亏
下面只介绍
dispatch_source定时器的实现 先上代码
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW,HXMessageShowTime * NSEC_PER_SEC),10 * NSEC_PER_SEC , 0);
dispatch_source_set_event_handler(timer, ^{
[self doSomething];
dispatch_cancel(timer);
});
dispatch_resume(timer);
}];
1 首先创建一个
dispatch_source_create
timer类型的信号量。
2 调用
dispatch_source_set_timer设置信号的频率
3 用
dispatch_source_set_event_handler设置定时器出发的事件
4 启用定时器。
5 在handler里面完成我们要做的工作,取消定时器。
我们也可以在程序的任何地方随时
dispatch_cancel 这个定时器,这样就能取消定时器事件了