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?
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 } });
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];
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.
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.