检查任何 ViewController 中的任何计时器 运行

Check for any timers running in any ViewController

我在我的一个 ViewController(我们称它为 VC1)中创建并启动了一个自重复计时器,以播放某种图像幻灯片。当转换到任何其他 VC 时,VC1 的计时器似乎保持 运行,因为它的选择器方法每两秒打印一次东西。由于这会干扰从任何其他 VC 返回到 VC1 时的计时器,所以我必须在某些时候将其删除。

这是控制台中发生的事情:(runImages() 是计时器的选择器,数字是应该显示的图像,如您所见,它很奇怪...)

  1. 我以为退出 VC1 后计时器会停止,因为我没有在任何地方保存它。由于情况并非如此,我想我可能会在离开 VC1 时删除计时器。 VC1 即将被解散时是否有方法被调用?

  2. 我想到的另一种方法是删除其他 VC 源代码开头的所有计时器。因此,当我输入 VC2 时,我想检查项目中是否有任何 运行 的计时器。有没有一种方法可以在不使计时器成为所有 VCs 都可以访问的全局变量的情况下做到这一点?

代码参考

这是我创建计时器的方式:(在方法之外)

var timer: NSTimer!

然后,在我设置的方法中:

timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "runImages:", userInfo: nil, repeats: true)

runImage() 然后增加 i 并调用 changeImage() 将我的 imageView 的图像转换为名为 i.

的图像

提前致谢:)

更新

我将计时器设为每个 VC 都可以访问的全局变量。该应用程序在 VC1 中启动,然后我转换到 VC2。在那里,我插入了这段代码:if let t = timer {t.invalidate()}if timer.valid {timer.invalidate()}。现在这没什么区别,计时器的选择器方法会继续打印内容...

您应该在 viewcontroller 中保留对计时器的引用,即 "using" 它...

class ViewController: UIViewController {
  var timer: NSTimer?

  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("timerFired"), userInfo: nil, repeats: true)
  }

  func timerFired() {
    // do whatever you want
  }

  override func viewWillDisappear(animated: Bool) {
    if timer != nil {
      timer?.invalidate()
      timer = nil
    }

    super.viewWillDisappear(animated)
  }
}

试试这个

import UIKit

class ViewController: UIViewController {

    let timeInterval: NSTimeInterval = 5 // seconds

    // The run loop maintains a strong reference already.
    weak var timer: NSTimer?

    func startTimer() {
        // 1. invalidate previous timer if necessary
        timer?.invalidate()

        // 2. setup a new timer
        timer = NSTimer.scheduledTimerWithTimeInterval(
            timeInterval,
            target: self,
            selector: "timerFired",
            userInfo: nil,
            repeats: true
        )
    }

    func stopTimer() {
        timer?.invalidate()
        timer = nil
    }

    // Need to include @objc marker here
    // Function must not be private.
    @objc internal func timerFired() {
        /* 
        Perform any UI Updates or whatever... 
        */
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        startTimer()
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
        stopTimer()
    }
}