一、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
网友评论