返回

重学GCD之 DispatchSourceTimer

IOS

iOS 中上层的定时器 API(如 NSTimerDispatchAfter)存在诸多限制。对于需要更加灵活和细粒度控制定时任务的场景,GCD 提供了一个更为强大的选择:DispatchSourceTimer

DispatchSourceTimer 的优势

  • 更高的精度: DispatchSourceTimer 可以以纳秒为单位精确计时,而 NSTimerDispatchAfter 只支持毫秒级精度。
  • 灵活的调度: 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,开发者可以构建出更加复杂和精确的定时任务,满足各种应用场景。