web-dev-qa-db-fra.com

swift invalidate timer ne fonctionne pas

J'ai ce problème depuis quelques jours maintenant et je ne comprends pas ce que je fais mal.

Mon application ne fait que créer des minuteries. Je dois les arrêter et en créer de nouveaux. Mais pour le moment, les arrêter ne fonctionne pas.

self.timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target:self, selector: "timerDidEnd:", userInfo: "Notification fired", repeats: false)

C'est ma minuterie

func timerDidEnd(timer:NSTimer){
    createUnrepeatedAlarmWithUpdateInterval()
}

Parce que ma minuterie ne voulait pas s'arrêter, j'utilise actuellement la minuterie non répétée et la démarre moi-même après son arrêt.

func stopAlarm() {

    if self.timer != nil {
        self.timer!.invalidate()
    }
    self.timer = nil
    self.timer = NSTimer()
}

Et c'est comme ça que j'arrête mon chronomètre.

alarmManager.stopAlarm()
alarmManager.createUnrepeatedAlarmWithUpdateInterval()

J'appelle la fonction stopAlarm() avant de créer une nouvelle minuterie.

Je ne sais vraiment pas ce que je fais mal donc j'apprécie chaque réponse :)

class AlarmManager: ViewController{

private var timer : NSTimer?
private var unrepeatedTimer : NSTimer?
private let notificationManager = NotificationManager()
private var current = NSThread()
private let settingsViewController = SettingsViewController()

func createRepeatedAlarmWithUpdateInterval(){

    var timeInterval:NSTimeInterval = settingsViewController.getUpdateIntervalSettings()

    if timer == nil{
    timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval,
        target: self,
        selector: "repeatedTimerDidEnd:",
        userInfo: "Notification fired",
        repeats: true)
    }
}
func repeatedTimerDidEnd(repeatedTimer:NSTimer){
    ConnectionManager.sharedInstance.loadTrainings(settingsViewController.getServerSettings())
    createUnrepeatedAlarm(10)
}

func createUnrepeatedAlarm(timeInterval:Double){

    unrepeatedTimer = NSTimer.scheduledTimerWithTimeInterval(timeInterval,
        target: self,
        selector: "unrepeatedTimerDidEnd:",
        userInfo: "Notification fired",
        repeats: false)
}
func unrepeatedTimerDidEnd(unrepeatedTimer:NSTimer){
    notificationManager.createNotification(self, reminderType: NotificationManager.ITEMRATINGREMINDER)
    notificationManager.createNotification(self, reminderType: NotificationManager.ITEMREMINDER)
    print("UnrepeatedAlarm ended")
}

func stopAlarm(){
    print("StopAlarm triggered")
    if (timer != nil)
    {
        print("stoptimer executed")
        timer!.invalidate()
        timer = nil
    }

    if (unrepeatedTimer != nil)
    {
        unrepeatedTimer!.invalidate()
        unrepeatedTimer = nil
    }
}
}

C'est tout le code de cette classe. Peut-être que cela aide: D

18
Banelu

La façon habituelle de démarrer et d'arrêter une minuterie en toute sécurité est

var timer : NSTimer?

func startTimer()
{
  if timer == nil {
    timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: "timerFired", userInfo: nil, repeats: true)
  }
}

func stopTimer()
{
  if timer != nil {
    timer!.invalidate()
    timer = nil
  }
}

startTimer() démarre la minuterie uniquement si elle est nil et stopTimer() ne l'arrête que si elle n'est pas nil.

Vous n'avez qu'à prendre soin d'arrêter le chronomètre avant d'en créer/démarrer un nouveau.

Dans Swift remplacer

  • NSTimer avec Timer,
  • NSTimer.scheduledTimerWithTimeInterval( Avec Timer.scheduledTimer(timeInterval:
  • selector: "timerFired" Avec selector: #selector(timerFired).
33
vadian

Assurez-vous que vous appelez invalidate sur le même thread que le minuteur.

De la documentation:

Considérations spéciales Vous devez envoyer ce message à partir du thread sur lequel le minuteur a été installé. Si vous envoyez ce message à partir d'un autre thread, la source d'entrée associée au minuteur peut ne pas être supprimée de sa boucle d'exécution, ce qui pourrait empêcher le thread de se terminer correctement.

https://developer.Apple.com/documentation/foundation/nstimer/1415405-invalidate?language=objc

7
Kevin Kruusi