返回
重学GCD之 DispatchSourceTimer
IOS
2023-11-10 09:38:43
iOS 中上层的定时器 API(如 NSTimer
和 DispatchAfter
)存在诸多限制。对于需要更加灵活和细粒度控制定时任务的场景,GCD 提供了一个更为强大的选择:DispatchSourceTimer
。
DispatchSourceTimer 的优势
- 更高的精度:
DispatchSourceTimer
可以以纳秒为单位精确计时,而NSTimer
和DispatchAfter
只支持毫秒级精度。 - 灵活的调度:
DispatchSourceTimer
允许开发者指定重复间隔、开始和结束时间,并可以随时取消或修改。 - 可移植性:
DispatchSourceTimer
可用于 macOS、iOS 和 tvOS 等多种平台。
如何使用 DispatchSourceTimer
创建 DispatchSourceTimer
需要使用 dispatch_source_create
函数,指定定时器类型为 DISPATCH_SOURCE_TYPE_TIMER
。
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
接下来,设置定时器间隔和开始时间:
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), 1 * NSEC_PER_SEC, 0);
然后,指定定时器处理程序:
dispatch_source_set_event_handler(timer, ^{
// 定时器触发时的处理逻辑
});
最后,启动定时器:
dispatch_resume(timer);
与其他定时器 API 的对比
特征 | DispatchSourceTimer | NSTimer | DispatchAfter |
---|---|---|---|
精度 | 纳秒级 | 毫秒级 | 毫秒级 |
灵活度 | 高 | 中 | 低 |
可移植性 | 高 | 低 | 中 |
实例
以下示例演示了如何使用 DispatchSourceTimer
创建一个每秒打印一次的定时任务:
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), 1 * NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(timer, ^{
NSLog(@"定时任务已触发");
});
dispatch_resume(timer);
结论
DispatchSourceTimer
是 iOS 开发中定时任务的强大工具。它提供了更高的精度、灵活性和可移植性,弥补了其他定时器 API 的不足。通过掌握 DispatchSourceTimer
,开发者可以构建出更加复杂和精确的定时任务,满足各种应用场景。