SwiftUI Timer 基础教程

Timer

经过一定时间间隔后触发的计时器,将指定的消息发送到目标对象。

class Timer : NSObject

使用教程

计时器与运行循环配合使用。运行循环会维护对其计时器的强引用,因此在将计时器添加到运行循环后,您不必维护自己的对计时器的强引用。

为了有效地使用计时器,您应该了解运行循环的运行方式。有关更多信息,请参见线程编程指南。

计时器不是实时机制。如果计时器的触发时间发生在长时间运行的循环调用期间或运行循环处于不监视计时器的模式下,则直到下次运行循环检查计时器时,计时器才会启动。因此,计时器触发的实际时间可能要晚得多。另请参阅计时器容差。

比较重复和不重复计时器

您可以指定计时器在创建时是重复还是不重复。非重复计时器触发一次,然后自动使其自身无效,从而防止计时器再次触发。相比之下,重复计时器会触发,然后在同一运行循环上重新安排自身的时间。重复计时器始终根据计划的点火时间进行调度,而不是实际的点火时间。例如,如果定时器计划在特定时间触发,然后每5秒触发一次,则即使实际触发时间被延迟,计划的触发时间也将始终落在原始的5秒时间间隔上。如果触发时间延迟得太远,以至于超过了计划的触发时间中的一个或多个,则计时器在该时间段仅触发一次;计时器会在触发后重新安排为将来的下一个计划的触发时间。

计时器公差

在iOS 7和更高版本以及macOS 10.9和更高版本中,您可以指定计时器的公差(公差)。计时器启动时的这种灵活性提高了系统优化的能力,以提高节电和响应速度。计时器可以在其预定的点火日期与预定的点火日期加公差之间的任何时间点火。计时器不会在计划的触发日期之前触发。对于重复计时器,下一个点火日期是根据原始点火日期计算的,而不考虑各个点火时间的公差,以避免漂移。默认值为零,这意味着不应用其他公差。系统保留对某些计时器应用少量公差的权利,而与公差属性的值无关。

作为计时器的用户,您可以确定计时器的适当公差。一般规则,对于重复计时器,将公差设置为间隔的至少10%。即使很小的容差也会对应用程序的电源使用产生重大的积极影响。系统可以强制执行公差的最大值。

在运行循环中安排计时器

您可以一次仅在一个运行循环中注册一个计时器,尽管可以将其添加到该运行循环中的多个运行循环模式中。有三种创建计时器的方法:

使用ScheduledTimer(timeInterval:invocation:repeats :)或ScheduledTimer(timeInterval:target:selector:userInfo:repeats :)类方法创建计时器,并在默认模式下将其安排在当前运行循环中。

使用init(timeInterval:invocation:repeats :)或init(timeInterval:target:selector:userInfo:repeats :)类方法可以创建计时器对象,而无需在运行循环中进行调度。 (创建计时器后,必须通过调用相应的RunLoop对象的add(_:forMode :)方法将计时器手动添加到运行循环中。)

分配计时器并使用init(fireAt:interval:target:selector:userInfo:repeats :)方法将其初始化。 (创建计时器后,必须通过调用相应的RunLoop对象的add(_:forMode :)方法将计时器手动添加到运行循环中。)

一旦安排在运行循环中,计时器就会以指定的时间间隔触发,直到失效为止。非重复计时器在触发后立即失效。但是,对于重复计时器,您必须自己调用计时器对象invalidate()方法来使计时器对象无效。调用此方法要求从当前运行循环中删除计时器。因此,您应该始终从安装计时器的同一线程调用invalidate()方法。使计时器无效会使它立即禁用,以使其不再影响运行循环。然后,运行循环将在invalidate()方法返回之前或稍后某个时间删除计时器(及其对计时器的强引用)。一旦失效,计时器对象将无法重用。

重复触发计时器后,它将在指定的容差范围内,为最近的将来日期安排下一次触发,该日期是最近一次计划的点火日期之后计时器间隔的整数倍。如果调出执行选择器或调用所需的时间长于指定的时间间隔,则计时器仅安排下一次触发;否则,定时器将仅计划下一次触发。也就是说,计时器不会。

推荐

基础文章推荐

  • 《SwiftUI是什么,听听大牛们如何说》

经典教程推荐

  • 更新近百篇SwiftUI教程《SwiftUI2020教程》
  • 帮您突破数据存储难关《SwiftUI vs CoreData数据存储解决方案》

上新

  • 《WWDC2020专栏》
  • 《SwiftUI WWDC2020 新增组件列表》

技术源码推荐

推荐文章

CoreData篇

  • SwiftUI数据存储之做个笔记App 新增与查询(CoreData)
  • SwiftUI进阶之存储用户状态实现登录与登出
  • SwiftUI 数据之List显示Sqlite数据库内容(2020年教程)

Combine篇

  • 一篇文章学懂弄通SwiftUI与Combine(含轮播动画App源码)

TextField篇

  • 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源码)》
  • 《SwiftUI实战之TextField风格自定义与formatters》
  • 《SwiftUI实战之TextField如何给键盘增加个返回按钮(隐藏键盘)》
  • 《SwiftUI 当键盘出现时避免TextField被遮挡自动向上移动》
  • 《SwiftUI实战之TextField如何给键盘增加个返回按钮(隐藏键盘)》

JSON文件篇

  • SwiftUI JSON文件下载、存储、解析和展示(代码大全)

一篇文章系列

  • SwiftUI一篇文章全面掌握List(教程和源码)
  • 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源码)》
  • SwiftUI一篇文章全面掌握Picker,解决数据选择(教程和源码)
  • SwiftUI一篇文章全面掌握Form(教程和源码)
  • SwiftUI Color 颜色一篇文章全解决

技术交流

QQ:3365059189
SwiftUI技术交流QQ群:518696470

  • 请关注我的专栏icloudend, SwiftUI教程与源码
    https://www.jianshu.com/c/7b3e3b671970

你可能感兴趣的:(SwiftUI Timer 基础教程)