Timer
经过一定时间间隔后将触发的计时器,将指定的消息发送到目标对象。
class Timer : NSObject
总览
计时器与运行循环配合使用。运行循环会维护对其计时器的强引用,因此在将计时器添加到运行循环后,您不必维护自己的对计时器的强引用。
为了有效地使用计时器,您应该了解运行循环的运行方式.计时器不是实时机制。如果在长时间运行的循环调用期间或运行循环处于不监视计时器的模式时发生计时器的触发时间,则直到下一次运行循环检查计时器时,计时器才会启动。因此,计时器触发的实际时间可能要晚得多。另请参阅计时器容差。
比较重复和不重复计时器
您可以指定计时器在创建时是重复还是不重复。非重复计时器触发一次,然后自动使其自身无效,从而防止计时器再次触发。相比之下,重复计时器会触发,然后在同一运行循环上重新安排自身的时间。重复计时器始终根据计划的点火时间进行调度,而不是实际的点火时间。例如,如果定时器计划在特定时间触发,然后每5秒触发一次,则即使实际触发时间被延迟,计划的触发时间也将始终落在原始的5秒时间间隔上。如果触发时间延迟得太远,以至于超过了计划的触发时间中的一个或多个,则计时器在该时间段仅触发一次;触发后,计时器会重新安排,
计时器公差
在iOS 7和更高版本以及macOS 10.9和更高版本中,您可以指定计时器的公差(tolerance)。计时器启动时的这种灵活性提高了系统优化的能力,以提高节电和响应速度。计时器可以在其预定的点火日期与预定的点火日期加公差之间的任何时间点火。计时器不会在计划的触发日期之前触发。对于重复计时器,下一个点火日期是根据原始点火日期计算的,而不考虑各个点火时间的公差,以避免漂移。默认值为零,这意味着不应用其他公差。系统保留对某些计时器应用少量容差的权利,而不论该tolerance属性的值如何。
作为计时器的用户,您可以确定计时器的适当公差。一般规则,对于重复计时器,将公差设置为间隔的至少10%。即使很小的容差也会对应用程序的电源使用产生重大的积极影响。系统可以强制执行公差的最大值。
在运行循环中安排计时器
您可以一次仅在一个运行循环中注册一个计时器,尽管可以将其添加到该运行循环中的多个运行循环模式中。有三种创建计时器的方法:
使用或类方法创建计时器,并在默认模式下将其安排在当前运行循环上。scheduledTimer(timeInterval:invocation:repeats:)scheduledTimer(timeInterval:target:selector:userInfo:repeats:)
使用或类方法创建计时器对象,而不在运行循环上安排它。(创建计时器后,必须通过调用相应对象的方法将计时器手动添加到运行循环中。)init(timeInterval:invocation:repeats:)init(timeInterval:target:selector:userInfo:repeats:)add(_:forMode:)RunLoop
分配计时器并使用方法将其初始化。(创建计时器后,必须通过调用相应对象的方法将计时器手动添加到运行循环中。)init(fireAt:interval:target:selector:userInfo:repeats:)add(_:forMode:)RunLoop
一旦安排在运行循环中,计时器就会以指定的时间间隔触发,直到失效为止。非重复计时器在触发后立即失效。但是,对于重复计时器,您必须通过调用其invalidate()方法自己使计时器对象无效。调用此方法要求从当前运行循环中删除计时器。因此,您应该始终invalidate()从安装计时器的同一线程中调用该方法。使计时器无效会使它立即禁用,以使其不再影响运行循环。然后,运行循环将删除该计时器(以及该计时器必须具有的强引用),方法是在invalidate()方法返回之前或稍后。一旦失效,计时器对象将无法重用。
重复触发计时器后,它将在指定的内,为最近的将来日期安排下一次触发,该日期是最近一次计划的点火日期之后计时器间隔的整数倍tolerance。如果调出执行选择器或调用所需的时间长于指定的间隔,则计时器仅安排下一次触发;否则,定时器将仅计划下一次触发。也就是说,计时器不会尝试补偿在调用指定的选择器或调用时可能发生的任何丢失的触发。
子类注释
不要子类化Timer。
主题
创建一个计时器
1、class func scheduledTimer(withTimeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void) -> Timer
创建一个计时器,并在默认模式下将其安排在当前运行循环上。
2、class func scheduledTimer(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool) -> Timer
创建一个计时器,并在默认模式下将其安排在当前运行循环上。
3、class func scheduledTimer(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool) -> Timer
创建一个新计时器,并在默认模式下将其安排在当前运行循环上。
4、init(timeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void)
使用指定的时间间隔和块初始化计时器对象。
5、init(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)
使用指定的对象和选择器初始化计时器对象。
6、init(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool)
使用指定的调用对象初始化计时器对象。
7、init(fire: Date, interval: TimeInterval, repeats: Bool, block: (Timer) -> Void)
使用指定的块为指定的日期和时间间隔初始化计时器。
8、init(fireAt: Date, interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)
使用指定的对象和选择器初始化计时器。
触发计时器
func fire()
使计时器的消息发送到其目标。
停止计时器
func invalidate()
停止计时器再次触发,并请求将其从运行循环中删除。
检索计时器信息
1、var isValid: Bool
一个布尔值,指示计时器当前是否有效。
2、var fireDate: Date
计时器将触发的日期。
3、var timeInterval: TimeInterval
计时器的时间间隔,以秒为单位。
4、var userInfo: Any?
接收者的对象。userInfo
配置射击公差
1、var tolerance: TimeInterval
在计划的触发日期之后定时器可以触发的时间。
作为组合发布者触发消息
1、static func publish(every: TimeInterval, tolerance: TimeInterval?, on: RunLoop, in: RunLoop.Mode, options: RunLoop.SchedulerOptions?) -> Timer.TimerPublisher
返回一个发布者,该发布者在给定的时间间隔内反复发出当前日期。
2、class Timer.TimerPublisher
在给定的时间间隔内反复发出当前日期的发布者。
实战代码
SwiftUI Timer仿短信发送倒计时(教程含源码)
推荐
基础文章推荐
- 《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