web-dev-qa-db-fra.com

annulation de performSelector en file d'attente: appels afterDelay

est-ce que quelqu'un sait s'il est possible d'annuler des événements de sélecteur déjà en file d'attente de la pile d'événements ou de la pile du minuteur (ou quel que soit le mécanisme utilisé par l'API) lorsque vous appelez performSelector:withObject:afterDelay?

J'utilisais cette pile d'événements pour modifier les attributs d'une image dans un onglet TabBar, et parfois je mettais en file d'attente jusqu'à 10 secondes de modifications en une seule rapidement exécutée pour la boucle ... peut-être 5 millisecondes environ.

le problème se pose si l'utilisateur change d'onglet ... comme disons que j'ai les modifications d'image en file d'attente pour une image qui s'affiche dès que l'onglet # 4 est activé, puis l'utilisateur passe rapidement à l'onglet # 3, puis de nouveau directement à l'onglet # 4 ... cela remettrait ensuite en file d'attente 10 secondes de modifications pendant que l'ancienne file était toujours en cours de lecture, probablement environ 2 ou 3 secondes dans la file d'attente si elle était commutée assez rapidement ... mais même en arrivant à 5 secondes pour le flux était un problème.

donc j'avais besoin d'un moyen pour annuler l'ancienne pile de modifications avant d'en mettre une nouvelle ...

J'écris cette requête au passé, car j'ai déjà trouvé une solution alternative à ce problème en ajoutant un filtre d'événement aux yeux de faucon sur la fonction de lecture. Cependant, je suis toujours curieux de savoir si l'annulation d'un événement est possible, car j'ai le sentiment qu'une telle connaissance sera utile à l'avenir. merci pour toute aide apportée :)

114
eerok512
[NSObject cancelPreviousPerformRequestsWithTarget:]

ou

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

target est l'objet d'origine sur lequel performSelector:afterDelay: a été appelé.

Par exemple:

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

Voir Apple docs , c'est juste à la fin du performSelector:withObject:afterDelay: la description.

238
stefanB

Afin d'annuler toutes les demandes d'exécution précédentes, vous pouvez utiliser:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
2
Marco Mirisola

Si vous recherchez "performSelector" pour avoir son "cancelPreviousPerformSelector" correspondant ... ce n'est pas le cas. (Ugh, Apple, pourquoi tu me fais ça ???)

Les, euh, ah, méthodes "d'appariement" sont:

performSelector

cancelPreviousPerformRequestsWithTarget

(Juste pour le rendre encore plus difficile à retenir, sans chercher dans les documents.)

2
Irene

Vérifiez les documents NSRunLoop. Tu veux -cancelPerformSelectorsWithTarget:

1
NSResponder