annullamento delle chiamate performSelector in coda: afterDelay


115

qualcuno sa se è possibile annullare gli eventi del selettore già accodati dallo stack degli eventi o dallo stack del timer (o qualsiasi meccanismo sia utilizzato dall'API) quando si chiama performSelector:withObject:afterDelay?

Stavo usando questo stack di eventi per modificare gli attributi di un'immagine all'interno di una scheda TabBar e talvolta mettevo in coda fino a 10 secondi di modifiche in uno eseguito rapidamente per ciclo ... forse 5 millisecondi o giù di lì.

il problema sorge se l'utente cambia scheda ... come dire che ho le alterazioni dell'immagine in coda per un'immagine che viene visualizzata non appena la scheda n. 4 viene abilitata, quindi l'utente passa rapidamente alla scheda n. 3 e poi torna subito alla scheda # 4 ... questo reinserirebbe quindi altri 10 secondi di alterazioni mentre la vecchia coda era ancora in riproduzione, probabilmente circa 2 o 3 secondi nella coda se cambiata abbastanza velocemente ... ma arrivando anche a 5 secondi dopo il flusso era un problema.

quindi avevo bisogno di un modo per annullare la vecchia pila di modifiche prima di inserire una nuova pila su ...

Sto scrivendo questa query al passato perché ho già trovato una soluzione alternativa a questo problema aggiungendo un filtro di eventi con occhi di falco sulla funzione di riproduzione. tuttavia sono ancora curioso di sapere se è possibile annullare un evento, perché ho la sensazione che tale conoscenza tornerà utile in futuro. grazie per qualsiasi assistenza resa :)


come potresti usare il filtro degli eventi con gli occhi di falco sulla funzione di riproduzione?
Maniganda saravanan

Risposte:


241
[NSObject cancelPreviousPerformRequestsWithTarget:]

o

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

Il targetè l'oggetto originale su cui performSelector:afterDelay:è stato chiamato.

Per esempio:

// schedule the selector
[self performSelector:@selector(mySel:) withObject:nil afterDelay:5.0];
// cancel the above call (and any others on self)
[NSObject cancelPreviousPerformRequestsWithTarget:self];

Vedi i documenti Apple , è proprio alla fine della performSelector:withObject:afterDelay:descrizione.


33
Per qualche chiarimento sul suo utilizzo, prova questo: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson

[NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector (mySel :) object: nil];
webtrick101

2

Per annullare tutte le precedenti richieste di esecuzione, puoi utilizzare:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   

2

Se stai cercando "performSelector" per avere la sua corrispondenza " cancelPreviousPerformSelector" ... non è così. (Uffa, Apple, perché me lo fai ???)

I, ehm, ah, i metodi di "corrispondenza" sono:

performSelector

cancelPreviousPerformRequestsWithTarget

(Solo per renderlo più difficile da ricordare, senza cercare i documenti.)


1

Controlla la documentazione di NSRunLoop. Tu vuoi-cancelPerformSelectorsWithTarget:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.