用dispatch_source实现可取消的定时器

来源:互联网 发布:淘宝c店违反广告法处罚 编辑:程序博客网 时间:2024/05/16 01:29
1 在开发的过程中,定时器是一个必不可少的功能,我们可以用NStimer,CADisplayLink,GCD Timer
CADisplayLink 是一个保持屏幕同频率的计时器类,一般用在动画或者视频的渲染,不是作为定时器事件来用的。
NSTimer不多讲,这个刚入门的iOS开发者用的大多都是这个,而且大部分情况下能够实现我们的功能。比如取消已经在队列的任务。这个就需要用到GCD Timer了
而且GCD相对于NStimer有很多优势
GCD的定时器和NSTimer是不一样的,NSTimer受RunLoop影响,但是GCD的定时器不受影响,因为RunLoop也是基于GCD的
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相关事件的通知
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 这个定时器,这样就能取消定时器事件了