使 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()
正在取消定时器:
if (timer.isValid()) {
timer.invalidate()
}
计时器=零;
只需调试您的应用并检查您没有释放计时器的地方。
记住,定时器会保留它的目标,所以如果你想释放目标,你也需要释放定时器,或者你可以编写自己的定时器,并引用 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()
我的应用程序中有 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()
正在取消定时器:
if (timer.isValid()) { timer.invalidate() }
计时器=零;
只需调试您的应用并检查您没有释放计时器的地方。
记住,定时器会保留它的目标,所以如果你想释放目标,你也需要释放定时器,或者你可以编写自己的定时器,并引用 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()