1. NSTimer 不是很精确
2.CADisplayLink 屏幕
3.通过GCD来实现定时间器
//定时循环执行事件
//dispatch_source_set_timer 方法值得一提的是最后一个参数(leeway),他告诉系统我们需要计时器触发的精准程度。
所有的计时器都不会保证100%精准,这个参数用来告诉系统你希望系统保证精准的努力程度。
如果你希望一个计时器每5秒触发一次,并且越准越好,那么你传递0为参数。
另外,如果是一个周期性任务,比如检查email,那么你会希望每10分钟检查一次,但是不用那么精准。
所以你可以传入60,告诉系统60秒的误差是可接受的。他的意义在于降低资源消耗。
// 在全局队列里面
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,globalQueue);
// 设置每隔多久时间执行
dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC);
// 执行事件
dispatch_source_set_event_handler(_timer, ^{ //计时器事件处理器
DLog(@"Event Handler");
if (timeout <= 0) {
dispatch_source_cancel(_timer); //取消定时循环计时器;使得句柄被调用,即事件被执行
dispatch_async(mainQueue,