封装一个GCD定时器,彻底解决定时器循环引用、释放时机问题

本文探讨了在iOS开发中使用GCD封装定时器以解决循环引用和释放时机的问题。通过在回调handler中传入dispatch_source_t timer参数,确保了在执行handler时timer不会被提前释放。同时,添加target参数以便在对象销毁时自动销毁定时器,避免循环引用。提供了源码实现,并强调了正确取消定时器的重要性。
摘要由CSDN通过智能技术生成

相信大家在开发中都会使用到定时器, 但又常常对定时器的循环引用问题, NSTimer 释放时机的选择上,劳神费力! 读了本文,这些再也不是问题!
关于 NSTimer 创建定时器的方法,我就不多做描述了,网上很多例子,但也总觉得很麻烦。本文主要讲使用GCD的方法。

今天在重构代码的时候,发现项目中好几个地方都用到了定时器,就想着封装一个定时器的方法,以后用着方便,也可以丰富自己的工具类库;写的时候,发现 GCD定时器方法并不被执行,细看之下感觉跟以前写的也没什么区别啊,但为什么就没有执行呢?

void dispatchTimer(double timeInterval, void (^handler)())
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(timer,dispatch_time(DISPATCH_TIME_NOW, 0),1.0*NSEC_PER_SEC, 0); 
    dispatch_source_set_event_handler(timer, ^{

            dispatch_async(dispatch_get_main_queue(), ^{
                handler();
            });
    });
    dispatch_resume(timer);
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值