📜  Swift中的计时器

📅  最后修改于: 2021-01-11 08:03:41             🧑  作者: Mango

Swift中的计时器

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

让我们看看如何使用运行循环来创建重复和不重复的计时器,跟踪计时器,以及如何减少其对能源和电力的影响。

创建一个重复计时器

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

句法

let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: true)

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

例:

let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fire), userInfo: nil, repeats: true)
@objc func fire() 
{
    print("FIRE!!!")
}

在上面的示例中,

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

参数说明

在此示例中,使用5个参数创建计时器。

  • timeInterval:指定计时器触发之间的时间间隔(以秒为单位),类型为Double。
  • 目标:它指定一个类实例,应在其上调用选择器的函数
  • 选择器:使用#selector(…)指定计时器触发时要调用的函数
  • userInfo:它指定一个字典,其中包含提供给选择器的数据,或者为nil。
  • 重复:指定此计时器是重复还是不重复。

创建一个非重复计时器

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

例:

let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fire), userInfo: nil, repeats: false)
@objc func fire() 
{
    print("FIRE!!!")
}

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

使用Closure创建一个计时器

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
    print("FIRE!!!")
})

在上面的代码中,最后一个参数块带有一个闭包。闭包本身具有一个参数计时器。

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

重复和不重复计时器之间的区别

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

非重复计时器会触发一次,然后自动使其自身无效,因此,它将阻止计时器再次触发。

重复计时器触发,然后在同一运行循环上重新安排自身的时间。重复计时器始终根据计划的点火时间进行调度,而不是实际的点火时间。

例如,如果计划将计时器在特定时间触发,然后每隔10秒触发一次,则即使实际触发时间被延迟,计划的触发时间也将始终落在原始的10秒时间间隔内。