annulation des appels performSelector en file d'attente: afterDelay

115

est-ce que quelqu'un sait s'il est possible d'annuler les événements de sélecteur déjà mis en file d'attente à partir de la pile d'événements ou de la pile de minuterie (ou de tout 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 je mettais parfois en file d'attente jusqu'à 10 secondes de modifications dans une boucle exécutée rapidement pour ... peut-être 5 millisecondes environ.

le problème survient si l'utilisateur change d'onglet ... comme disons que les modifications d'image sont mises en file d'attente pour une image qui s'affiche dès que l'onglet n ° 4 est activé, puis l'utilisateur passe rapidement à l'onglet n ° 3, puis revient directement à l'onglet # 4 ... cela remettrait ensuite en file d'attente 10 secondes supplémentaires de modifications pendant que l'ancienne file d'attente était encore 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.

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

J'écris cette requête au passé car j'ai déjà proposé 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 assistance rendue :)

eerok512
la source
Comment pouvez-vous utiliser un filtre d'événement aux yeux de faucon sur la fonction de lecture?
Maniganda saravanan

Réponses:

241
[NSObject cancelPreviousPerformRequestsWithTarget:]

ou

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

Le targetest l'objet d'origine sur lequel a performSelector:afterDelay:é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 la documentation Apple , c'est juste à la fin de la performSelector:withObject:afterDelay:description.

stefanB
la source
33
Pour obtenir des éclaircissements sur son utilisation, essayez ceci: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson
[NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector (mySel :) object: nil];
webtrick101
2

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

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
Marco Mirisola
la source
2

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

Les méthodes, euh, ah, "correspondant" sont:

performSelector

cancelPreviousPerformRequestsWithTarget

(Juste pour rendre les choses encore plus difficiles à retenir, sans chercher dans la documentation.)

Irène
la source
1

Consultez la documentation NSRunLoop. Tu veux-cancelPerformSelectorsWithTarget:

NSResponder
la source