使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()
-
取消计时器:
if(timer.isValid()){timer.invalidate()}
timer = nil;
-
只需调试你的应用程序并检查你没有释放计时器的位置。
-
请记住,该计时器保留了它的目标,所以如果你想释放目标,你也需要释放计时器,或者你可以编写你自己的计时器,并在一周内参考目标。