2009-11-27 6 views
109

Est-ce que quelqu'un sait s'il est possible d'annuler des événements de sélecteur déjà mis en file d'attente de la pile d'événements ou de la pile de temporisateurs (performSelector:withObject:afterDelay? J'utilisais cette pile d'événements pour modifier les attributs d'une image dans un onglet TabBar, et mettait parfois en file d'attente jusqu'à 10 secondes de changements dans une boucle rapidement exécutée ... peut-être 5 millisecondes environ. Le problème se pose si l'utilisateur bascule des onglets ... comme dis j'ai les modifications d'image en file d'attente pour une image qui est affichée dès que l'onglet n ° 4 est activé, puis l'utilisateur passe rapidement à l'onglet n ° 3, puis de retour à l'onglet n ° 4 ... cela remettrait en attente 10 secondes supplémentaires de retouches alors que la vieille file d'attente était encore en train de jouer, probablement environ 2 ou 3 secondes dans la file d'attente si elle était commutée assez rapidement ... 5 secondes dans le flux était un problème.annulé performSelector: afterDelay appels

donc je besoin d'une certaine façon d'annuler l'ancienne pile de changements avant de mettre une nouvelle pile sur ...

J'écris cette requête au passé parce que je suis déjà venu avec une solution alternative à cette problème en ajoutant un filtre d'événements Hawk-eyed 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 que de telles connaissances seront utiles à l'avenir. je vous remercie de toute assistance fournie :)

+0

comment pourriez-vous utiliser filtre d'événements de faucon aux yeux sur la fonction de lecture? –

Répondre

227
[NSObject cancelPreviousPerformRequestsWithTarget:] 

ou

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:] 

Le target est l'objet original 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, il est vrai à la fin de la description performSelector:withObject:afterDelay:.

+33

Pour quelques précisions sur son utilisation, essayez ceci: [NSObject cancelPreviousPerformRequestsWithTarget: self]; – dnstevenson

+2

Edité pour utiliser votre commentaire - merci dnstevenson! – Tim

+0

Excellente réponse! – pmk

1

Vérifiez les documents NSRunLoop. Vous voulez -cancelPerformSelectorsWithTarget:

2

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

Le, euh, ah, "correspondant à" méthodes: performSelector cancelPreviousPerformRequestsWithTarget

(Juste pour le rendre plus dur à retenir, . sans chercher les docs)

2

pour annuler toutes les précédentes demandes effectuer, vous pouvez utiliser:

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
Questions connexes