Quindi, in pratica, ho questo timer che deve essere ripetuto quando riceve un evento chiave e invalida quando l'utente rilascia la chiave. Tuttavia, non riesco a "convalidare" il timer indietro anche chiamando lo addTimer:forMode:
in NSRunLoop. Qualcuno sa perché questo sta accadendo e come posso risolvere questo problema? Grazie.Come "convalidare" un NSTimer dopo averlo invalidato?
risposta
Non è possibile utilizzare il timer non valido.
da Apple Documenti:
volta fissata su un loop di esecuzione, i timer incendi al specificato intervallo finché non viene invalidata. Un timer non ripetuto invalida lo stesso immediatamente dopo l'attivazione. Tuttavia, per un timer ripetuto, l'utente deve invalidare autonomamente l'oggetto timer chiamando il suo metodo invalido . La chiamata a questo metodo richiede la rimozione del timer dal ciclo di esecuzione corrente ; di conseguenza, dovresti sempre chiamare il metodo inverso dallo stesso thread su cui è stato installato il timer. L'invalidazione del timer lo disabilita immediatamente in modo che non sia più influenzare il ciclo di esecuzione. Il ciclo di esecuzione rimuove e rilascia il timer , appena prima che il metodo invalidi ritorni o in qualche punto successivo di . Una volta invalidati, gli oggetti timer non possono essere riutilizzati.
Dopo aver invalidato un NSTimer, non è necessario utilizzarlo di nuovo.
Invece, creare una nuova istanza timer e utilizzare tale istanza per aggiungere al metodo addTimer di NSRunLoop. Personalmente preferisco semplicemente chiamare il programmato TimerWithTimeInterval di NSTimer perché fa tutto in un colpo solo.
Da NSTimer docs:
si chiama questo metodo richiede la rimozione del timer della corrente di loop corsa; di conseguenza, dovresti sempre chiamare il metodo invalido dallo stesso thread su cui è stato installato il timer. Invalidando il timer lo disabilita immediatamente in modo che non influenzi più il ciclo di esecuzione . Il ciclo di esecuzione rimuove e rilascia il timer, o solo prima che il metodo invalidi ritorni o in un secondo momento. Dopo l'annullamento di , gli oggetti timer non possono essere riutilizzati.
Giusto, non lo sapevo ... Grazie! – TheAmateurProgrammer
È interessante notare che esiste addTimer di NSRunLoop ma non esiste removeTimer che potrebbe essere stato utile per arrestare il timer dall'attivazione senza invalidarlo. Deve essere che la creazione del timer è più economica della creazione di porte in modo che Apple non si preoccupi di aggiungere quell'api. –