iOS中最全的各种定时器使用教程

2020-01-21 00:59:16于丽

重复执行的定时器


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 的使用以及注意事项中有提及, 主要有以下两种: