deadline和wallDeadline——DispatchQueue两个方法比较

1 提问

在 Swift 编程中,想要延迟执行某个任务,最简单的方法莫过于使用 DispatchQueue 的 asyncAfter 方法。

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
   // 要执行的操作
   print("延迟2秒执行的打印")
}

使用该方法,可以在延迟 2 秒后执行 print 操作。
然而,苹果还向我们提供了另外一个方法:

DispatchQueue.main.asyncAfter(wallDeadline: .now() + 2) {
   // 要执行的操作
   print("延迟2秒执行的打印")
}

运行起来,也是延迟 2 秒后执行了 print 操作。那这两个方法的区别是什么?

2 求索

求知就该追本溯源,我找到了苹果官方文档:
asyncAfter(deadline:execute:)

asyncAfter(deadline:execute:)

asyncAfter(wallDeadline:execute:)

asyncAfter(wallDeadline:execute:)

这下完全蒙圈了,两个方法的解释一模一样,一字不差。完全傻傻分不清楚了。

3 解惑

幸而有大模型 DeepSeek 横空出世,为我们做出了解答:

asyncAfter(deadline:execute:)asyncAfter(wallDeadline:execute:) 的主要区别在于它们计算延迟时间所依据的时钟不同,这会影响任务执行的时机,尤其是在系统休眠或时钟调整的情况下。

1. asyncAfter(deadline:execute:)

  • 时间基准:基于 系统时钟(DispatchTime
    • 系统时钟跟踪的是设备正常运行的时间(不包括休眠时间)。
    • 当设备进入休眠状态时,系统时钟会暂停,直到设备唤醒后继续计时。
  • 适用场景
    • 需要任务在设备实际活跃运行的时间间隔后执行。
    • 例如:游戏动画、UI 更新等需要与设备运行状态同步的操作。

示例:

DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
   // 此任务会在设备运行(非休眠)5 秒后执行。
   // 若设备中途休眠了 10 秒,实际触发时间会延后 10 秒。
}

2. asyncAfter(wallDeadline:execute:)

  • 时间基准:基于 墙上时间(DispatchWallTime
    • 墙上时间是现实世界的时间(类似钟表时间),始终递增,不受系统休眠影响。
    • 即使设备休眠,墙上时间仍会继续流逝。
  • 适用场景
    • 需要任务在绝对时间点执行,与实际时间流逝严格一致。
    • 例如:闹钟、定时提醒、与真实时间相关的任务。

示例:

DispatchQueue.main.asyncAfter(wallDeadline: .now() + 5) {
   // 此任务会在 5 秒的墙上时间后执行。
   // 若设备中途休眠了 10 秒,触发时间会在唤醒后立即执行(因为实际时间已过 5 秒)。
}

关键区别对比

特性 asyncAfter(deadline:) asyncAfter(wallDeadline:)
时间基准 系统时钟(DispatchTime 墙上时间(DispatchWallTime
系统休眠影响 休眠期间计时暂停 休眠期间计时继续
适用场景 与设备运行状态同步的任务 需要严格按实际时间触发的任务
延迟计算 设备活跃运行时间 真实世界时间

选择建议

  • 如果任务需要在设备活跃运行一定时间后触发(如动画、后台数据处理),使用 asyncAfter(deadline:)
  • 如果任务需要在固定的真实时间点触发(如闹钟、定时通知),使用 asyncAfter(wallDeadline:)

总结

有解释、有示例、有对比、有表格,真是详尽而全面。真是羡慕当下的开发者,有如此便捷的学习工具。按照 DeepSeek 的建议选择合适的 API 使用即可。

  • 如果任务需要在设备活跃运行一定时间后触发(如动画、后台数据处理),使用 asyncAfter(deadline:)
  • 如果任务需要在固定的真实时间点触发(如闹钟、定时通知),使用 asyncAfter(wallDeadline:)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容