I have 4 NSTimers
objects in my app , that make requests to a rest URL every few seconds.
On clicking of a particular button
I want to stop the timer so that it stops polling and on click of another button
I want to resume polling.
I have tried invalidate
for all timers but does not work.
NOTE: All timers are in different class and I'm trying to invalidate the timers in another class
Any help will be appreciated , thank you.
class NotificationViewController:UIViewController {
var timer:NSTimer?
getEvents(){
if((timer == nil)) {
timer = NSTimer.scheduledTimerWithTimeInterval(20.0, target: self, selector: Selector("getEvents"), userInfo: nil, repeats: true)
}
}
}
In another class I'm doing this on click of a button
class Menu:UIViewController {
@IBAction func buttonTapped(sender: UIButton) {
self.notify.timer?.invalidate()
self.notify.timer = nil
}
}
Try to create a separate NotificationTimer
class and used its shared object all over the project like this way.
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)
}
}
}
Now call this timer1
object inside any ViewController
like this way.
let notificationTimer = NotificationTimer.sharedManager
notificationTimer.timer1?.invalidate()
Or call that method like this way
NotificationTimer.sharedManager().getEvents()
It seems that you are losing the original reference to the timers. One possible evil solution, is to keep the reference across the app. You can do that using struct
:
struct Timers {
static var firstTimer = NSTimer()
static var secondTimer = NSTimer()
static var thirdTimer = NSTimer()
static var fourthTimer = NSTimer()
}
This way you could access the timer from anywhere in the program:
Timers.firstTimer.invalidate()