2016-08-08 27 views
2

Ich habe 4 NSTimers Objekte in meiner App, die Anfragen alle paar Sekunden an eine Rest-URL stellen.NSTimer ungültig machen

Beim Klicken auf eine bestimmte button Ich möchte den Timer stoppen, so dass es abfragt abhöre und auf einen anderen button Ich möchte das Polling fortsetzen.

Ich habe versucht invalidate für alle Timer aber nicht funktioniert.

HINWEIS: Alle Timer sind in verschiedenen Klassen und ich versuche, die Timer in einer anderen Klasse ungültig zu machen Jede Hilfe wird geschätzt, danke.

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 einer anderen Klasse Ich tue dies auf einen Klick

class Menu:UIViewController { 

    @IBAction func buttonTapped(sender: UIButton) { 
     self.notify.timer?.invalidate() 
     self.notify.timer = nil 
    } 
} 
+1

den Code Setzen Sie, dass Sie versuchen. –

+0

Bearbeitet die Frage –

+0

'self.notify' Objekt ist das gleiche, das Sie verwendet haben, um den' NSTimer' zu initialisieren? –

Antwort

1

Versuchen eine separate NotificationTimer Klasse und verwendet seine gemeinsames Objekt der ganzen Projekt wie auf diese Weise zu erstellen.

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) 
     } 
    }  
} 

Jetzt nennen das timer1 Objekt in jedem ViewController wie auf diese Weise.

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

Oder rufen Sie die Methode, wie diese Weise

NotificationTimer.sharedManager().getEvents() 
+0

Der Timer wird nur einmal ausgelöst. Es wiederholt sich nicht nach 20 Sekunden –

+0

Haben Sie den Selektor geändert? weil getEvents derselbe ist, der den Timer initialisiert. –

+0

Nein Ich habe den Selektor nicht geändert, es ist das gleiche. Die Methode wird nur einmal aufgerufen, nach 20 Sekunden wird sie nicht erneut ausgeführt. –

3

Es scheint, dass Sie die ursprüngliche Bezugnahme auf die Timer verlieren. Eine mögliche evil Lösung, ist es, die Referenz über die App zu halten. Sie können tun, dass die Verwendung von struct :

struct Timers { 
    static var firstTimer = NSTimer() 
    static var secondTimer = NSTimer() 
    static var thirdTimer = NSTimer() 
    static var fourthTimer = NSTimer() 
} 

diese Weise können Sie den Timer von überall im Programm zugreifen konnte:

Timers.firstTimer.invalidate() 
+0

Nein der Timer läuft immer noch –

+0

Warum brauchen Sie Statik ??? Warum müssen Sie von überall im Programm auf die Timer zugreifen? Wie ist das mit der Freigabe von Timern verbunden? es ist nicht die Lösung!Darüber hinaus ist es Antipattern in den meisten Fällen – Nikita

+0

Ich möchte den Timer aus einer anderen ViewController-Klasse zu stoppen, also würde ich darauf zugreifen müssen in diesem ViewController –

0
  1. Abbrechen der Timer:

    if (Timer. isValid()) { timer.invalidate() }

    Timer = Null;

  2. Debuggen Sie einfach Ihre App und überprüfen Sie, wo Sie den Timer nicht freigeben.

  3. Denken Sie daran, dass der Timer sein Ziel behält. Wenn Sie also das Ziel freigeben möchten, müssen Sie auch den Timer freigeben oder Sie können einen eigenen Timer mit Wochenreferenz auf das Ziel schreiben.