dispatch_source_t之Timer
/**
1.注意:timer必须是全局变量或者静态变量,否则回调不执行
2.dispatch_source_set_timer 中第二个参数,当我们使用 dispatch_time 或者 DISPATCH_TIME_NOW 时,系统会使用默认时钟来进行计时。然而当系统休眠的时候,默认时钟是不走的,也就会导致计时器停止。使用 dispatch_walltime 可以让计时器按照真实时间间隔进行计时
3.dispatch_source_set_timer 的第四个参数 leeway 指的是一个期望的容忍时间,将它设置为 1 秒,意味着系统有可能在定时器时间到达的前 1 秒或者后 1 秒才真正触发定时器。在调用时推荐设置一个合理的 leeway 值。需要注意,就算指定 leeway 值为 0,系统也无法保证完全精确的触发时间,只是会尽可能满足这个需求。
*/
//创建timer
- (dispatch_source_t)creatTimer{
static int plus = 0;
static dispatch_source_t _timer = nil;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(_timer, ^{
NSLog(@"plus = %d",plus++);
});
dispatch_resume(_timer);
return _timer;
}
//销毁timer
- (void)destoryTimer:(dispatch_source_t)timer{
dispatch_source_cancel(timer);
timer = nil;
}
/**
1.使用 dispatch_suspend 时,Timer 本身的实例需要一直保持。
2.这种方式只是让timer挂起并没有销毁,不可置为nil,否则会崩溃
*/
- (void)destoryUseTimer:(dispatch_source_t)timer{
dispatch_suspend(timer);
}