美文网首页
deadline和wallDeadline——DispatchQ

deadline和wallDeadline——DispatchQ

作者: 竹本 | 来源:发表于2025-02-23 15:08 被阅读0次

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:)

相关文章

  • modal带有导航控制器VC

    解析:为什么在DispatchQueue.main.async {}中执行弹出?回答: 如果不在DispatchQ...

  • 当deadline遇上deadline

    今天是交作业的日子,我在家里收拾屋子,因为明天就要交房给租户了。 房子空了三个月,要交房了才来收拾。 上周交完作业...

  • Deadline

    某次和爸爸聊天,听他说起我小学的时候,总是放学一回家就写作业,认真仔细地完成以后才去做其他的事。高中时的事情很多都...

  • Deadline

    一直说Deadline是第一生产力。确实,因为Deadline的存在,迫使自己完成了很多事情。所以一直以来我都还是...

  • Deadline

    从心理上我觉得把作业留到最后一天不是好习惯,这样没质量、缺效益的虽然效率极高。从行为上,我总是把作业拖到最后一天,...

  • Deadline

    这两天的作业,都是赶在零点之前交的,似乎老毛病又犯了。 排除没素材,不知如何下笔的原因,剩下的也就这些...

  • deadline

    明天,确切说是今天要交盲审论文,晚上改到一点多回了宿舍。不禁在想是否自己态度有问题,为何临阵不停的在发现问题!这两...

  • DEADLINE

    大学期间里,对于需要完成的任务(大多指他人委以),我似乎毫无二致的有两点脾性:其一,若不临近deadline事情似...

  • Deadline

    今天真的注意力高度集中,不可不停地忙活了一天。一直很排斥守合同重信用的申报。居然忘记了今天是税务的最后一天,下午火...

  • Deadline

    找死都不怕,还怕等死吗? 今天看到了《创始人》这本书的第二十章,主题是Deadline与呆到烂。 Deadline...

网友评论

      本文标题:deadline和wallDeadline——DispatchQ

      本文链接:https://www.haomeiwen.com/subject/hfripjtx.html