使NSTimer无效

我的应用程序中有4个NSTimers对象,每隔几秒就会向一个restURL发出请求。

点击一个特定的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 Menu:UIViewController { @IBAction func buttonTapped(sender: UIButton) { self.notify.timer?.invalidate() self.notify.timer = nil } } 

尝试创建一个单独的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) } } } 

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

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

或者像这样调用该方法

 NotificationTimer.sharedManager().getEvents() 

您似乎正在失去对计时器的原始引用。 一个可能的邪恶解决方案是保持应用程序的引用。 你可以使用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()}

    timer = nil;

  2. 只需调试你的应用程序并检查你没有释放计时器的位置。

  3. 请记住,该计时器保留了它的目标,所以如果你想释放目标,你也需要释放计时器,或者你可以编写你自己的计时器,并在一周内参考目标。