2015-12-29 11 views
10

Ho questo problema da alcuni giorni e non capisco cosa sto facendo male.timer invalido rapido non funziona

La mia applicazione è fondamentalmente solo la creazione di alcuni timer. Devo fermarli e crearne di nuovi. Ma al momento fermarli non funziona.

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

Questo è il mio timer

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

Perché il mio timer non voleva fermarsi Attualmente sto usando il timer non ripetuto e iniziare io stesso dopo si è fermato.

func stopAlarm() { 

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

Ed è così che interrompo il mio timer.

alarmManager.stopAlarm() 
alarmManager.createUnrepeatedAlarmWithUpdateInterval() 

Io chiamo la funzione stopAlarm() prima di creare un nuovo timer.

Io davvero non so cosa sto facendo male così mi rendo conto ogni risposta :)

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

Quello è tutto il codice di questa classe. Forse questo aiuta: D

+2

Sei sicuro che il timer non si ferma? Potrebbe essere che stai creando più timer? – Cristik

+0

Assicurati di chiamare 'stopAlarm()' dal thread principale. –

+0

@MariusFanu Definisco definitivamente stopAlarm dal thread principale. Ho stampato il filo per essere sicuro ed era lo stesso. – Banelu

risposta

16

Il solito modo per avviare ed arrestare un timer in modo sicuro

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() aziona il timer solo se si tratta di nil e stopTimer() si ferma solo se non è nil.

hai solo a prendersi cura di fermare il timer prima di creare/di iniziare uno nuovo.

In Swift 3 sostituire

  • NSTimer con Timer,
  • NSTimer.scheduledTimerWithTimeInterval( con Timer.scheduledTimer(timeInterval:
  • selector: "timerFired" con selector: #selector(timerFired).
+0

Questo è fondamentalmente quello che sto facendo. Penso che il mio problema sia altrove. Ho stampato una riga quando stopTimer() è stato eseguito e ho stampato una riga all'interno di if. Non ho mai visto la linea all'interno del se nella mia uscita, quindi non ho mai capito se. Quindi il problema è il mio se. Aiuto? : D – Banelu

+0

Il tuo codice sembra un po 'confuso, anche il timer "ripetuto" non viene ripetuto. Prova un timer ripetuto usando il mio codice. – vadian

+0

Non ho un timer ripetuto. Sono entrambi non ripetuti. Ho scritto alcune righe sopra nella mia domanda. Il problema non è la creazione del timer o che stopTimer() non è utilizzato o altro. Il "se timer! = Nil" non è mai vero. Perché? – Banelu