CCD比NSTimer相对准时的原因

一、NSTimer不准时的原因,主要有两个:
1.Runloop循环处理的时间
2.受Runloop模式的影响
二、GCDTimer
1.GCDTimer精度高
2.GCDTimer主线程执行会RunLoop影响,子线程不受影响
3.GCDTimer不受模式切换的影响

- (void) gcdTimerTest {
    
    // 队列
    dispatch_queue_t queue = dispatch_get_main_queue();//在主队列上会受runloop的影响,主线程上
//    dispatch_queue_t queue = dispatch_queue_create("timer_serial_label", DISPATCH_QUEUE_SERIAL);//非主队列上不受runloop影响,子线程上
    // 创建定时器
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    
    // 设置定时的开始时间、间隔时间,dispatch_time(DISPATCH_TIME_NOW, 0):开始时间,立即开合,0改为2,则2秒后开始
    dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 0), 1*NSEC_PER_SEC, 0);
    
    // 设置定时器回调
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"你好%@",[NSThread currentThread]);
    });
    // 启动定时器,默认是关闭的
    dispatch_resume(timer);
    self.timer = timer;
//    dispatch_cancel(self.timer);//定时器停止
//    self.timer = nil; //因为是强引用,要置空
/**
dispatch_resume(self.timer);//执行的情况下,返回时会走dealloc方法
dispatch_suspend(self.timer);//挂起的情况下,返回时会崩溃
NSTimer不能暂停,只能销毁,timer可以通过dispatch_suspend(self.timer)暂停定时器
dispatch_cancel(self.timer);//定时器停止时,返回不会崩溃
*/
}

三、GCD timer与NSTimer是不同的:
1.二者都是源,一个是RunLoop的源,一个Dispatch的源
2.GCD timer不需要加入mode

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,868评论 8 265
  • Runloop 是和线程紧密相关的一个基础组件,是很多线程有关功能的幕后功臣。尽管在平常使用中几乎不太会直接用到,...
    jackyshan阅读 13,310评论 10 75
  • 说明iOS中的RunLoop使用场景1.保持线程的存活,而不是线性的执行完任务就退出了<1>不开启RunLoop的...
    野生塔塔酱阅读 11,744评论 15 109
  • RunLoop的基本了解 **1 . RunLoop字面的意思 : **运行循环 / 跑圈 **2 . 基本作用 ...
    Mario_ZJ阅读 3,486评论 1 3
  • 哈金是我在上写作课时,我的老师巫昂推荐的当代作家。他出生在辽宁,大学就读黑龙江大学英语系,后在山东大学攻读美国文学...
    FreeManFree阅读 8,684评论 0 3