C'è un modo per cancellare dispatch_after() programmato per un po 'di tempo in futuro, e non è stato sparato finora? Sto provando a creare qualcosa come uno scheduler per gli aggiornamenti dal server, e questo metodo è proprio come voglio, ma, mi piacerebbe cancellarlo e riprogrammarlo ad un certo punto. È possibile o devo effettuare il fallback e usare NSTimer?annulla il metodo dispatch_after()?
risposta
Utilizzare una fonte di timer di invio (ovvero ciò che dispatch_after
utilizza internamente in ogni caso).
Un'origine del timer di invio può essere annullata o i suoi parametri del timer modificati dopo la creazione.
Non esiste un modo per impedire l'esecuzione di dispatch_block una volta che è stato inviato alla coda, il che significa che il tuo dispatch_after non può essere annullato. L'unica opzione è aggiungere al blocco una condizione da verificare in fase di esecuzione per impedire l'esecuzione. ie.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(),^{
if(self.shouldExecuteDispatchBlock)
{ // do your stuff } });
Hmmm così fino alla prossima volta che si esegue l'esecuzione di questo blocco (ed è impostato per essere cancellato), immagino che fino ad allora si accaparrerebbe tutta la memoria/gli oggetti. Forse un problema se i tuoi cicli sono come 60 minuti? :-) – Jonny
Sì e no. Il blocco copia la memoria, il che significa che se si fa riferimento a un valore int nel proprio blocco, questo verrà copiato e rimarrà in memoria come duplicato per tutto il tempo in cui il blocco è attivo. Ma per oggetto, non li duplica, copia l'indirizzo. Nel caso in cui si refere un'immagine, si avrà un oggetto UIImage nell'heap ma il blocco manterrà solo un valore del puntatore (8 byte in arc64) quindi, nessun problema. Ovviamente l'immagine verrà mantenuta in memoria fino a quando il blocco si spegne, quindi non sarà pulito da arco. –
L'ho trasformato in un'estensione per DispatchQueue: https://github.com/nrbrook/DispatchAfterCancellable – Nick
OK, così, con tutte le risposte raccolte, e le possibili soluzioni, sembra la migliore per questo caso (conservando semplicità) sta chiamando performSelector:withObject:afterDelay:
e annullarlo con cancelPreviousPerformRequestsWithTarget:
chiamata quando desiderato. Nel mio caso - poco prima di pianificare chiamata successiva ritardata:
[NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self];
[self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay];
Ho iniziato questo percorso, ma come farlo con i metodi di classe (che è il motivo per cui sono passato a 'dispatch_after')? – Olie
@Olie bravo. Quindi devi avvolgere quelle chiamate in istanza, o usare dispatch + flag (indovina, in secondo luogo sarebbe più semplice) –
A questo scopo ho usato questa classe: la funzione
https://github.com/SebastienThiebaud/dispatch_cancelable_block
è possibile chiamare un annullare() di revocare l'esecuzione di ciò che è in il blocco.
Se lo useresti in Swift - puoi guardarlo qui https://github.com/katleta3000/CancelBlocks/ – katleta3000
- 1. Python Annulla metodo mock
- 2. dispatch_after equivalent in NSOperationQueue
- 3. dispatch_after rispetto a performSelector afterDelay
- 4. C#: CancellationToken non annulla il metodo di blocco
- 5. Annulla UIScrollView rimbalzo dopo il trascinamento
- 6. UISearchDisplayController - Metodo per quando si fa clic sul pulsante Annulla
- 7. VIM annulla: Perché il cursore salta nella posizione sbagliata quando si annulla il `annullamento '?
- 8. UIActionSheet annulla il pulsante non chiude il foglio di azioni
- 9. Annulla corrente UIScrollView touch
- 10. Personalizza il pulsante Annulla del framework Twitter
- 11. Annulla AsyncTask quando l'utente preme il pulsante
- 12. UISearchController disattiva VC premendo il pulsante Annulla
- 13. Come gestire il pulsante Annulla in JOptionPane
- 14. Pulsante Annulla UISearchBar non funziona
- 15. Annulla modifica Visualizza database Realm.io
- 16. Usabilità Web: salva e annulla ... oppure ... annulla e salva?
- 17. UISearchBar pulsante Annulla non risponde
- 18. Annulla/arresta attività asincrona Android
- 19. TimePickerDialog: Facendo clic sul pulsante "Annulla" chiama il metodoTimeSet()
- 20. Vim annulla: annulla le modifiche dopo la scrittura del file
- 21. git annulla file cancellati
- 22. Nascondi UISearchBar Pulsante Annulla
- 23. Annulla NamedPipeClientStream.Read call
- 24. Annulla un git stash
- 25. Pulsante Annulla UISearchBar
- 26. SDWebImage Annulla download
- 27. Annulla Intellij Smart Checkout
- 28. Annulla sessione in SilverStripe
- 29. Git annulla ultimo commit
- 30. Annulla evento key press
sì. sembra che abbiamo duplicati. Mi chiedo se è possibile unire queste domande? –