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

你可能感兴趣的:(CCD比NSTimer相对准时的原因)