我如何在Swift中使用NSTimer?

我试过了

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' 

这将工作:

 override func viewDidLoad() { super.viewDidLoad() //Swift >=3 selector syntax var timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) //Swift 2.2 selector syntax var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true) //Swift <2.2 selector syntax var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true) } // must be internal or public. @objc func update() { // Something cool } 

对于Swift 4来说,你想得到select器的方法必须暴露给Objective-C,因此@objc属性必须被添加到方法声明中。

Swift 3更新了一些更完整的例子。

重复的事件

您可以使用计时器多次执行操作,如以下示例所示。 计时器调用每半秒更新一次标签的方法。

在这里输入图像描述

这是这个代码:

 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)" } } 

延迟的事件

您还可以使用计时器在将来一段时间安排一次性事件。 与上面的例子的主要区别是你使用repeats: false而不是true

 timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false) 

上面的例子在定时器被设置两秒后调用一个名为delayedAction的方法。 这是不重复的,但是如果你需要在事件发生之前取消事件,你仍然可以调用timer.invalidate()

笔记

  • 如果有多次启动计时器实例的机会,请确保先使旧计时器实例无效。 否则,你会失去对定时器的引用,你不能再停下来了。 (见本问答 )
  • 当不需要时不要使用定时器。 请参阅iOS应用程序能源效率指南的计时器部分。

有关

  • 如何在Swift中处理date和时间

没有人需要用户信息?

 var timer: NSTimer? startTimer() { timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "event:", userInfo: ["custom":"data"], repeats: true) } } func event(timer: NSTimer!) { let info = timer.userInfo print(info) } 

从iOS 10开始,还有一个新的基于块的Timer工厂方法比使用select器更清晰:

  _ = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { timer in label.isHidden = true } 

请检查:

 var timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true); 

Swift 3,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) } } 

笔记

  • 它需要在主队列上
  • callback函数可以是公共的,私人的,…
  • callback函数需要是@objc

你将需要在Swift 3中使用Timer而不是NSTimer。

这里是一个例子:

 Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(YourController.update), userInfo: nil, repeats: true) func update() { // do what should happen when timer triggers an event } 

对于Swift 3和Xcode 8.2(很好有块,但是如果你为iOS9编译并且想要userInfo):

  self.timer = Timer(fireAt: fire, interval: deltaT, target: self, selector: #selector(timerCallBack(timer:)), userInfo: ["custom":"data"], repeats: true) RunLoop.main.add(self.timer!, forMode: RunLoopMode.commonModes) self.timer!.fire() } func timerCallBack(timer: Timer!){ let info = timer.userInfo print(info) } 

Swift 3中 ,像@objc这样的东西:

 func startTimerForResendingCode() { let timerIntervalForResendingCode = TimeInterval(60) Timer.scheduledTimer(timeInterval: timerIntervalForResendingCode, target: self, selector: #selector(timerEndedUp), userInfo: nil, repeats: false) } @objc func timerEndedUp() { output?.timerHasFinishedAndCodeMayBeResended() } 
 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(createEnemy), userInfo: nil, repeats: true) 

并通过名称创build乐趣createEnemy

 fund createEnemy () { do anything //// } 

SimpleTimer(Swift 3.1)

为什么?

这是一个简单的计时器类在迅速,使您能够:

  • 本地作用域计时器
  • 可链接
  • 一个内衬
  • 使用常规的callback

用法:

 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() } } 

如果你初始化定时器的方法

 let timer = Timer(timeInterval: 3, target: self, selector: #selector(update(_:)), userInfo: [key : value], repeats: false) func update(_ timer : Timer) { } 

然后将其添加到循环使用方法其他select器将不会被调用

 RunLoop.main.add(timer!, forMode: .defaultRunLoopMode) 

注:如果你想这个重复使重复真正的和保持定时器的引用,否则更新方法将不会被调用。

如果你正在使用这种方法。

 Timer.scheduledTimer(timeInterval: seconds, target: self, selector: #selector(update(_:)), userInfo: nil, repeats: true) 

如果重复是真的,请保留以备后用。