使NSTimer无效

时间:2016-08-08 06:55:16

标签: ios swift nstimer

我的应用中有4个NSTimers个对象,每隔几秒就会向一个休息网址发出请求。

点击特定的button我想停止计时器,以便停止投票,点击另一个button我想恢复投票。

我已经为所有计时器尝试了invalidate但是没有效果。

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

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 Menu:UIViewController {

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

3 个答案:

答案 0 :(得分:3)

您似乎正在失去对计时器的原始引用。 一个可能的evil解决方案,就是在整个应用中保留引用。您可以使用struct执行此操作 :

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

这样你就可以从程序的任何地方访问计时器:

Timers.firstTimer.invalidate()

答案 1 :(得分:1)

尝试创建一个单独的NotificationTimer类,并以这种方式在整个项目中使用其共享对象。

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

现在以这种方式在任何timer1内调用此ViewController对象。

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

或者像这样调用这种方法

NotificationTimer.sharedManager().getEvents()

答案 2 :(得分:0)

  1. 取消计时器:

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

    计时器= nil;

  2. 只需调试你的app并查看你没有释放计时器的位置。

  3. 请记住,该计时器会保留其目标,因此如果您想要释放目标,您还需要释放计时器,或者您可以编写自己的计时器,并在周参考目标。< / p>