用dispatch_source实现可取消的定时器

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 这个定时器,这样就能取消定时器事件了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值