重复执行的定时器
void
dispatch_source_set_timer(dispatch_source_t source,
dispatch_time_t start,
uint64_t interval,
uint64_t leeway)
参数:
source: 定时器 start: 开始时间, 当我们使用 dispatch_time 或者 DISPATCH_TIME_NOW 时,系统会使用默认时钟来进行计时。然而当系统休眠的时候,默认时钟是不走的,也就会导致计时器停止。使用 dispatch_walltime 可以让计时器按照真实时间间隔进行计时; interval: 间隔(如果设置为 DISPATCH_TIME_FOREVER 则只执行一次) leeway: 允许的误差范围; 计时不可能是百分百精确的, 即使设置为0, 也不是百分百精确的, 所以可以设置合理的允许误差, 单位: 纳秒(NSEC_PER_SEC)相关内容, 可参考文章: Dispatch Source Timer 的使用以及注意事项
// 重复执行的定时器
- (void)gcdTimer1 {
// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 创建定时器
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
// 开始时间
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
// dispatch_time_t start = dispatch_walltime(NULL, 0);
// 重复间隔
uint64_t interval = (uint64_t)(1.0 * NSEC_PER_SEC);
// 设置定时器
dispatch_source_set_timer(_timer, start, interval, 0);
// 设置需要执行的事件
dispatch_source_set_event_handler(_timer, ^{
//在这里执行事件
static NSInteger num = 0;
NSLog(@"%ld", (long)num);
num++;
if (num > 4) {
NSLog(@"end");
// 关闭定时器
dispatch_source_cancel(_timer);
}
});
// 开启定时器
dispatch_resume(_timer);
NSLog(@"start");
}
输出:
2016-12-30 10:15:01.114 定时器[3393:99474] start
2016-12-30 10:15:02.187 定时器[3393:99796] 0
2016-12-30 10:15:03.114 定时器[3393:99796] 1
2016-12-30 10:15:04.186 定时器[3393:99796] 2
2016-12-30 10:15:05.188 定时器[3393:99796] 3
2016-12-30 10:15:06.188 定时器[3393:99796] 4
2016-12-30 10:15:06.188 定时器[3393:99796] end
这里的开始时间设置了1s的间隔, 所以1s之后才开始执行,可以设置使用DISPATCH_TIME_NOW来立马执行;
注意:
这里的开始时间(start)可以使用下面的方式的来设置:
dispatch_time_t start = dispatch_walltime(NULL, 0);
或者直接设置为: DISPATCH_TIME_NOW
关于 dispatch_walltime 和 dispatch_time 的区别, 上面也有提及,也可参考stackOverflow上的这个回答; 主要区别就是前者在系统休眠时还会继续计时, 而后者在系统休眠时就停止计时, 待系统重新激活时, 接着继续计时;
停止计时器:
停止GCD定时器的方式, Dispatch Source Timer 的使用以及注意事项中有提及, 主要有以下两种:










