我试着
var timer = NSTimer()
timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)
但是,我得到了一个错误
'(timeInterval: $T1, target: ViewController, selector: () -> (), userInfo: NilType, repeats: Bool) -> $T6' is not identical to 'NSTimer'
Swift 3, pre iOS 10
func schedule() {
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(timeInterval: 20, target: self,
selector: #selector(self.timerDidFire(timer:)), userInfo: nil, repeats: false)
}
}
@objc private func timerDidFire(timer: Timer) {
print(timer)
}
Swift 3, iOS 10+
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(withTimeInterval: 20, repeats: false) { timer in
print(timer)
}
}
笔记
它需要在主队列上
回调函数可以是public, private,…
回调函数需要@objc
重复的事件
您可以使用计时器多次执行一个操作,如下面的示例所示。计时器每半秒调用一个方法来更新一个标签。
下面是它的代码:
import UIKit
class ViewController: UIViewController {
var counter = 0
var timer = Timer()
@IBOutlet weak var label: UILabel!
// start timer
@IBAction func startTimerButtonTapped(sender: UIButton) {
timer.invalidate() // just in case this button is tapped multiple times
// start the timer
timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
}
// stop timer
@IBAction func cancelTimerButtonTapped(sender: UIButton) {
timer.invalidate()
}
// called every time interval from the timer
func timerAction() {
counter += 1
label.text = "\(counter)"
}
}
延迟事件
您还可以使用计时器将一次性事件安排到未来的某一段时间。与上面例子的主要区别是使用了repeat: false而不是true。
timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false)
上面的示例在计时器设置后两秒调用一个名为delayedAction的方法。它不会重复,但如果需要在事件发生之前取消它,仍然可以调用timer.invalidate()。
笔记
如果有机会多次启动计时器实例,请确保先使旧的计时器实例失效。否则你会失去对计时器的引用,你就不能再停止它了。(见此问答)
不要在不需要的时候使用计时器。请参阅iOS应用程序能源效率指南的计时器部分。
相关的
如何在Swift中使用日期和时间
SimpleTimer (Swift 3.1)
Why?
这是一个简单的定时器类在swift,使您能够:
局部作用域定时器
证明
一个衬垫
使用常规回调
用法:
SimpleTimer(interval: 3,repeats: true){print("tick")}.start()//Ticks every 3 secs
代码:
class SimpleTimer {/*<--was named Timer, but since swift 3, NSTimer is now Timer*/
typealias Tick = ()->Void
var timer:Timer?
var interval:TimeInterval /*in seconds*/
var repeats:Bool
var tick:Tick
init( interval:TimeInterval, repeats:Bool = false, onTick:@escaping Tick){
self.interval = interval
self.repeats = repeats
self.tick = onTick
}
func start(){
timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(update), userInfo: nil, repeats: true)//swift 3 upgrade
}
func stop(){
if(timer != nil){timer!.invalidate()}
}
/**
* This method must be in the public or scope
*/
@objc func update() {
tick()
}
}