我的应用中有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
}
}
答案 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)
取消计时器:
if(timer.isValid()){ timer.invalidate() }
计时器= nil;
只需调试你的app并查看你没有释放计时器的位置。
请记住,该计时器会保留其目标,因此如果您想要释放目标,您还需要释放计时器,或者您可以编写自己的计时器,并在周参考目标。< / p>