2015-07-02 11 views
12

Come verificare se NSTimer è in esecuzione o meno in Swift. In obj-c il codice dovrebbe essere simile a questo come immagino:Come verificare se un NSTimer è in esecuzione o meno in Swift?

if (!myTimer) { 
    //DO 
} 

sto cercando di metterlo in Swift come questo e sta mostrando errori.

if !myTimer { 
// DO 
} 
+0

Fornire tutte le informazioni pertinenti, che includano il messaggio di errore completo effettivo. – zaph

+0

@amro shahbari swift 3.1 non funziona –

risposta

25

Quello che faccio (in entrambe le lingue) è di rendere il mio timer debole. In rapido sarebbe un optional debole.

weak var myTimer: NSTimer? 

Poi creare un timer con

myTimer = NSTimer.scheduledTimerWithTimeInterval(1, 
      target: self, 
      selector: "timerFired:", 
      userInfo: nil, 
      repeats: false) 

e poi si può usare

if timer == nil 

per dire se è in esecuzione.

Per fermare il timer basta chiamare

myTimer?.invalidate() 

In Objective-C sarebbe

[myTimer invalidate]; 

che opera in Objective-C, perché l'invio di messaggi ai puntatori a zero, è valida, e fa proprio Niente.

Se non si desidera utilizzare un opzionale debole, è possibile interrogare un timer per vedere se è in esecuzione osservando la sua proprietà valid.

+2

Solo perché 'timer' non è nullo non indica se è in esecuzione. – zaph

+3

Lo fa se lo rendi debole. Quindi l'unico riferimento proprietario è il ciclo di esecuzione, e dopo l'attivazione/quando viene invalidato, viene rilasciato e annullato. È a portata di mano. –

+0

No, con un puntatore debole, \t timerWithTimeInterval: target: selector: userInfo: ripetizioni: crea un timer immediatamente deallocato perché ha zero riferimenti forti. Si tratta di un caso degenere. Prova quello che descrivo. Funziona. Lo prometto. –

2
if !myTimer.valid { 
    //DO 
} 
+0

Affinché funzioni 'myTimer' deve essere dichiarato come proprietà' weak'. – zaph

+0

@ zaf, è sbagliato. Per questo approccio il timer ** non può ** essere dichiarato debole. –

11

Come circa l'opzione di seguito? Potete vedere se questo funziona per voi

if myTimer.valid { 
} 
+0

Affinché funzioni 'myTimer' deve essere dichiarato come proprietà' weak'. – zaph

+3

@zaph, no. Il mio approccio per renderlo debole e il controllo di nil funziona, OPPURE puoi renderlo forte e quindi controllare se timer.valid == true. L'uso di 'myTimer.valid' fa ** NOT ** richiede che' myTimer' sia debole. –

Problemi correlati