使 NSTimer 失效

Invalidating NSTimer

我的应用程序中有 4 个 NSTimers 对象,每隔几秒就会请求休息 URL。

单击某个特定 button 我想停止计时器以停止轮询,单击另一个 button 我想恢复轮询。

我已经尝试 invalidate 所有计时器但不起作用。

注意:所有计时器都在不同的 class 中,我正试图使另一个 class 中的计时器无效 任何帮助将不胜感激,谢谢。

class NotificationViewController:UIViewController {
    var timer:NSTimer?
    getEvents(){
    if((timer == nil)) {
        timer = NSTimer.scheduledTimerWithTimeInterval(20.0, target: self, selector: Selector("getEvents"), userInfo: nil, repeats: true)
    }
  }
}

在另一个 class 中,我通过单击按钮来执行此操作

class Menu:UIViewController {

    @IBAction func buttonTapped(sender: UIButton) {
        self.notify.timer?.invalidate()
        self.notify.timer = nil
    }
}

您似乎失去了对计时器的原始引用。 一个可能的 evil 解决方案 是在整个应用程序中保留引用。您可以使用 struct :

struct Timers {
   static var firstTimer = NSTimer()
   static var secondTimer = NSTimer()
   static var thirdTimer = NSTimer()
   static var fourthTimer = NSTimer()
}

这样您就可以从程序中的任何位置访问计时器:

Timers.firstTimer.invalidate()
  1. 正在取消定时器:

    if (timer.isValid()) { timer.invalidate() }

    计时器=零;

  2. 只需调试您的应用并检查您没有释放计时器的地方。

  3. 记住,定时器会保留它的目标,所以如果你想释放目标,你也需要释放定时器,或者你可以编写自己的定时器,并引用 week目标。

尝试创建一个单独的 NotificationTimer class 并像这样在整个项目中使用它的共享对象。

class NotificationTimer: NSObject {

    var timer1: NSTimer?
    var timer2: NSTimer?
    var timer3: NSTimer?
    var timer4: NSTimer?

    static let sharedManager = NotificationTimer()

    func getEvents(){
        print("Fired")
        if (timer1 == nil){
            timer1 = NSTimer.scheduledTimerWithTimeInterval(20.0, target: self, selector: Selector("methodYouWantToCall"), userInfo: nil, repeats: true)
        }
    }    
}

现在像这样在任何 ViewController 中调用此 timer1 对象。

let notificationTimer = NotificationTimer.sharedManager
notificationTimer.timer1?.invalidate()

或者像这样调用那个方法

NotificationTimer.sharedManager().getEvents()