web-dev-qa-db-fra.com

annuler la méthode dispatch_after ()?

Existe-t-il un moyen d'annuler dispatch_after () prévu pour un certain temps à l'avenir et qui n'a pas encore été déclenché? J'essaie de créer quelque chose comme un planificateur pour les mises à jour à partir du serveur, et cette méthode est exactement comme je le souhaite, mais j'aimerais l'annuler et la reprogrammer à un moment donné. Est-il possible ou dois-je recourir à NSTimer?

29
Oleg Shanyuk

Il n'y a AUCUN moyen d'empêcher un dispatch_block de s'exécuter une fois qu'il a été envoyé dans sa file d'attente, ce qui signifie que votre dispatch_after ne peut pas être annulé. La seule option est d'ajouter dans votre bloc une condition à vérifier au moment de l'exécution pour empêcher l'exécution. c'est à dire.

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^ {
if(self.shouldExecuteDispatchBlock)
{ // do your stuff }  });
24
Florian Burel

OK, donc, avec toutes les réponses recueillies et les solutions possibles, la meilleure solution pour ce cas (en préservant la simplicité) est d'appeler performSelector:withObject:afterDelay: et l'annuler avec cancelPreviousPerformRequestsWithTarget: appeler au besoin. Dans mon cas - juste avant de planifier le prochain appel retardé:

[NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self];

[self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay];
16
Oleg Shanyuk

Dans ce but, j'ai utilisé cette classe:

https://github.com/SebastienThiebaud/dispatch_cancelable_block

vous pouvez appeler une fonction cancel () pour révoquer l'exécution de ce qui est dans le bloc.

6
Zoltan Varadi

Utilisez une source de minuterie d'expédition (c'est ce que dispatch_after utilise de toute façon en interne).

Une source de temporisation de répartition peut être annulée ou ses paramètres de temporisation modifiés après sa création.

1
das