解决NSTimer不准确的GCD定时器

本文探讨了NSTimer在NSRunLoop繁忙时可能出现的不准时问题,并提出了利用GCD创建的定时器作为解决方案,保证定时任务的准时执行。文中还提供了线程安全的GCD定时器封装示例。
摘要由CSDN通过智能技术生成

NSTimer依赖于NSRunLoop,如果RunLoop的任务过于繁重,可能会导致NSTimer不准时
而CGD的定时器会更加准时;下面是创建GCD定时器所使用的函数

// 创建队列
    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);
    
    //设置时间间隔 start开始时间0立即开始interval间隔时间;
    dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, start*NSEC_PER_SEC), interval*NSEC_PER_SEC, 0);
    
    dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
    NSString *name = [NSString stringWithFormat:@"%lu",(unsigned long)_timerHander.count];
    _timerHander[name]=timer;
    dispatch_semaphore_signal(_semaphore);
    //设置回调
    dispatch_source_set_event_handler(timer, ^{
       
    });
    //启动定时器
    dispatch_resume(timer);

下例为线程安全的CGD定时器封装

static NS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值