这是一个基础工具:一个简单的 Grand Central Dispatch 定时器,可以重复触发,也可以只触发一次。
定时器在许多不同的情况下都是必需的。它们可以是时钟应用程序的驱动引擎,也可以是刷新显示或关闭屏幕的 UI 工具。
这将允许“宽限期”,Apple 建议这是一种帮助减少能源消耗的方法。
定时器是线程独立的。您可以在任何您想要的队列上实例化它。
它非常简单。只需“设置并忘记”,如果您只触发一次,或者只是一个简单的重复回调。
它应该可以很好地用于 macOS、TVOS、WatchOS 和 iOS/iPadOS。它仅依赖于 Swift Foundation 库。
这需要 Swift 4.0 或更高版本(已使用 4.2 测试)。
您可以使用 SPM 将项目作为依赖项加载,方法是引用其 GitHub 仓库 URI(SSH:git@github.com:RiftValleySoftware/RVS_BasicGCDTimer.git,或 HTTPS:https://github.com/RiftValleySoftware/RVS_BasicGCDTimer.git)。
一旦您附加了依赖项,您可以通过在使用该软件包的文件中添加导入来引用它
import RVS_BasicGCDTimer
您可以将其用作简单的源文件;而不是模块。
要使用它,只需将 RVS_BasicGCDTimer/RVS_BasicGCDTimer.swift 文件添加到您的项目中;将其复制到您想要的任何位置。
然后您实例化定时器
可以作为单次定时器(在本例中为 100 毫秒),也可以作为重复定时器
timeIntervalInSeconds
是一个双精度浮点数,表示定时器周期,以秒为单位(不是毫秒)。它必须是大于零的正值。
delegate
是必需的(如果没有 completion)。如果没有有效的 delegate 或 completion,定时器将根本无法工作。
leewayInMilliseconds
是 Apple 建议您给定时器的推荐“宽限期”。这有助于节省移动设备中的能源。
将 onlyFireOnce
设置为 true,以使定时器成为“单次”定时器。
someContext
是您想要返回到委托方法中回调的任何数据。它将作为定时器的 context
属性可用。
queue
是要使用的 GCD 队列。不指定意味着使用默认队列。
isWallTime
要求定时器使用“Apple 挂钟”时间。该时间是绝对的,并且不关心计算机是否休眠或有性能中断。它往往更一致。
请注意,使用挂钟时间可能会导致意外行为。例如,如果应用程序暂停一段时间并重新启动,则 completion 调用可能会立即执行,而不是从中断处继续。
completion
是一个 completion 函数。不指定它意味着应该提供一个委托。
注意:从 1.6.0 版本开始,现在有一个可选的 completion 函数。它可以是尾随 completion,并且现在不再需要委托。
newTimer = RVS_BasicGCDTimer(timeIntervalInSeconds: 0.1, delegate: someDelegate, leewayInMilliseconds: 25.0, onlyFireOnce: true, context: someContext, queue: DispatchQueue.main, isWallTime: true, completion: nil )
newTimer = RVS_BasicGCDTimer(timeIntervalInSeconds: 0.1, delegate: nil, leewayInMilliseconds: 25.0, onlyFireOnce: true, context: someContext, queue: DispatchQueue.main, isWallTime: true ) { inTimer, inIsSuccess in
print("Timer is \(String(describing: inTimer))")
print("Timer was".(inIsSuccess ? " " : "not ")."successful.")
}
}
在这里,我们指定一个重复定时器,没有宽限期,也没有上下文数据
newTimer = RVS_BasicGCDTimer(timeIntervalInSeconds: 0.1, delegate: someDelegate, leewayInMilliseconds: 0, onlyFireOnce: false, context: nil, queue: nil, isWallTime: false)
但是,有很多默认值。您可以指定完全相同的内容,如下所示
newTimer = RVS_BasicGCDTimer(timeIntervalInSeconds: 0.1, delegate: someDelegate)
或者
newTimer = RVS_BasicGCDTimer(timeIntervalInSeconds: 0.1) { inTimer, inIsSuccess in
print("Timer is \(String(describing: inTimer))")
print("Timer was".(inIsSuccess ? " " : "not ")."successful.")
}
或者
newTimer = RVS_BasicGCDTimer(0.1) { inTimer, inIsSuccess in
print("Timer is \(String(describing: inTimer))")
print("Timer was".(inIsSuccess ? " " : "not ")."successful.")
}
一旦定时器被实例化,您可以通过调用 resume()
来启动它
newTimer.resume()
您可以通过调用 pause()
来暂停(挂起)正在运行的定时器
newTimer.pause()
如果定时器尚未运行,则不会发生任何事情。如果它正在运行,则它会暂停。
如果是重复定时器,则定时器将重复,直到它失效或被取消初始化
newTimer.invalidate()
如果是“单次”定时器,则定时器在完成时立即失效。
从 1.6.0 版本开始,现在有一个可选的 completion 函数。它可以是尾随 completion。
completion 函数有 2 个参数:定时器实例和一个布尔值,如果定时器完成,则为 true;如果未完成,则为 false。
委托有一个必需的方法和四个可选方法(带有默认扩展处理程序)。传入的参数是定时器对象。
您可以查看定时器对象的 context
属性,以获取您希望回调访问的任何数据/函数/任何内容。
此方法在定时器完成时调用。它是必需的
func basicGCDTimerCallback(_ timer: RVS_BasicGCDTimer)
此方法是一个可选方法,在定时器变为有效时调用
func basicGCDTimerValid(_ timer: RVS_BasicGCDTimer)
此方法是一个可选方法,在定时器即将失效之前调用
func basicGCDTimerWillBecomeInvalid(_ timer: RVS_BasicGCDTimer)
这是一个可选方法,在定时器暂停时调用
func basicGCDTimerSuspend(_ timer: RVS_BasicGCDTimer)
这是一个可选方法,在定时器恢复时调用(包括初始启动)
func basicGCDTimerResume(_ timer: RVS_BasicGCDTimer)
在您的项目中使用 RVS_BasicGCDTimer 没有依赖项。
MIT 许可证
特此授予许可,免费向任何人获取本软件和相关文档文件(“软件”)的副本,以处理本软件,不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向已获得软件的人员提供软件,但须符合以下条件
上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。
本软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途的适用性和非侵权保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为或其他方面,由软件引起、出于软件或与软件或软件的使用或其他交易有关。
The Great Rift Valley Software Company: https://riftvalleysoftware.com