Swift 中的计时器

2024 年 8 月 29 日 | 阅读 3 分钟

在 Swift 中,定时器用于创建重复任务,以安排延迟工作。 它是一个以前称为 NSTimer 的类。 Swift 的定时器类提供了一种灵活的方式来安排将来发生的工作,可以是一次性的或重复性的。

让我们看看如何创建重复和非重复定时器,使用运行循环,跟踪定时器,以及如何减少它们的能量和功率影响。

创建重复定时器

我们可以使用以下语法创建并启动一个重复计数器

语法

让我们看一个例子来演示如何创建一个重复计数器

示例

在上面的示例中,

  • 使用 Timer.scheduledTimer(...) 类方法创建一个定时器。此方法的返回值将分配给常量 timer。这个常量现在包含对定时器的引用,稍后将使用它。
  • scheduledTimer() 的参数是 1 秒的定时器间隔。它使用一种称为目标-动作的机制,一些设置为 nil 的 userInfo,以及设置为 true 的参数 repeats。
  • 我们还编写了一个函数 fire()。 这是在定时器触发时调用的函数,即大约每秒。通过将 target 设置为 self 并将 selector 设置为 #selector(fire),您表明每当定时器触发时,都需要调用 self 的函数 fire()。

参数解释

在这个例子中,使用 5 个参数来创建一个定时器。

  • timeInterval: 它指定定时器触发之间的时间间隔(以秒为单位),类型为 Double。
  • target: 它指定函数 selector 应该调用的类实例
  • selector: 它指定定时器触发时要调用的函数,使用 #selector(...)
  • userInfo: 它指定一个包含提供给 selector 的数据的字典,或 nil。
  • repeats: 它指定此定时器是重复还是非重复。

创建非重复定时器

要创建非重复定时器,您只需将 repeats 参数设置为 false。 定时器只会触发一次,之后立即失效。

示例

注意:以上代码必须在类上下文中运行,例如在视图控制器类中。 fire() 函数是类的一部分,self 指的是当前的类实例。

使用闭包创建定时器

在上面的代码中,最后一个参数 block 接受一个闭包。 闭包有一个参数 timer 本身。

在这里,使用 @objc 属性,因为它使 fire() 函数在 Objective-C 中可用。 Timer 类是 Objective-C 运行时的一部分,这就是我们使用 @objc 属性的原因。

重复定时器和非重复定时器之间的区别

您必须在创建时指定定时器是重复还是非重复。重复定时器和非重复定时器之间的主要区别是

非重复定时器 触发一次,然后自动失效,因此,它可以防止定时器再次触发。

重复定时器 触发,然后重新安排在同一运行循环中。重复定时器总是根据预定的触发时间表重新安排自己,而不是实际的触发时间。

例如,如果一个定时器被安排在特定时间触发,并且每隔 10 秒触发一次,即使实际触发时间被延迟,预定的触发时间也总是落在原始的 10 秒时间间隔上。


下一篇SwiftyJSON