创建GCD定时器
//创建一个定时器(dispatch_source_t本质上还是一个OC对象)
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
NSLog(@"执行定时任务----");
});
_timer = timer;
//启动定时器(默认是暂停)
dispatch_resume(timer);
注意:默认创建的定时器对象需要强引用保住它的命,在任务执行中不被释放
定时器操作函数
dispatch_suspend 是将定时器暂停
dispatch_resume 是恢复定时器。
dispatch_source_cancel 是取消定时器
以下条件奔溃
- remuse(恢复)的状态下,如果再进行一次resume(恢复)就会crash,所以要注册一个BOOL值的状态进行记录,防止多次suspend和resume引起闪退。
- 在suspend(暂停)的状态下,如果你设置_timer = nil就会crash
官方注释
Calls to dispatch_suspend() must be balanced with calls to dispatch_resume().