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(…) 类方法创建了一个定时器。该方法的返回值赋给常量timer。现在,这个常量包含一个对定时器的引用,稍后将会用到。
- scheduledTimer()的参数是间隔为1秒的定时器。它使用了一种称为目标-动作(target-action)的机制,一些设置为nil的userInfo,以及参数repeats设置为true。
- 我们还编写了一个名为fire()的函数。这个函数在定时器触发时调用,大约每秒一次。通过将target设置为self,selector设置为#selector(fire),你指示每当定时器触发时,需要调用self的fire()函数。
参数解释
在这个示例中,使用了5个参数来创建定时器。
- timeInterval: 它指定了定时器触发之间的间隔,单位为秒,类型为Double。
- target: 它指定了应该在其上调用选择器函数的类实例。
- selector: 它指定了定时器触发时要调用的函数,使用了#selector(…)。
- userInfo: 它指定了一个包含要提供给选择器的数据的字典,或者为nil。
- repeats: 它指定了该定时器是重复还是非重复。
创建一个非重复的定时器
要创建一个非重复的定时器,只需将 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指的是当前类实例。
使用闭包创建一个计时器
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
print("FIRE!!!")
})
在上面的代码中,最后一个参数块接受一个闭包。闭包有一个参数是计时器本身。
在这里,使用@objc属性是因为它使得fire()函数在Objective-C中可用。计时器类是Objective-C运行时的一部分,这就是我们使用@objc属性的原因。
重复和非重复计时器之间的区别
在创建计时器时,必须指定计时器是重复还是非重复。重复和非重复计时器之间的主要区别是:
非重复计时器 只会触发一次,然后自动使自身无效,因此防止计时器再次触发。
重复计时器 会触发并在同一次运行循环上重新调度自己。重复计时器总是根据预定的触发时间进行调度,而不是实际的触发时间。
例如,如果一个计时器被预定在特定的时间触发,并且之后每10秒一次,即使实际触发时间延迟,预定的触发时间仍然会落在原始的10秒间隔上。