tuer des éléments dans un dispatch_async file d'attente dans iOS
Je suis en cours d'exécution un tas d'éléments en arrière-plan à l'aide de dispatch_async et parfois, j'ai envie de tuer ce que j'ai dans la file d'attente, est-ce possible? Par exemple, ce code est exécuté sur une vue, puis l'utilisateur remonte à l'écran. L'ensemble de ces déclenché des actions de continuer à fonctionner indépendamment de l'arrière de la navigation. Idéalement, je voudrais tuer ces éléments à partir de l'exécution:
dispatch_async(dispatch_get_global_queue(2, 0), ^{
for (int i=0; i<[self.manufacturers count]; i++) {
NSString *manufacturerID = [[[self.manufacturers objectAtIndex:i] ManufacturerID] stringValue];
[self doSync:manufacturerID withIndex:i setTimer:YES];
}
});
Si je créer une file d'attente et le nom, et puis de le relâcher sur le dealloc de la vue de ce qui est appelé dans ils continuent à s'exécuter.
OriginalL'auteur Slee | 2012-03-03
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de disposition explicite dans l'expédition des files d'attente pour la résiliation. Pour ce faire, il est assez courant pour tester une escapade emplacement pour déterminer la résiliation. En gros, ce serait un sémaphore.
NSOperationQueue
(un niveau plus élevé d'abstraction, mais encore construire à l'aide de PGCD-dessous) n'a pas le support pour l'annulation des opérations. Ainsi, par exemple, vous pouvez créer une série de NSOperations et de les ajouter à un NSOperationQueue puis message-cancelAllOperations
à la file d'attente lorsque vous n'en avez pas besoin pour terminer.Beaucoup de l'architecture que vous choisissez dépendra de la façon dont beaucoup de ces activités et si elles ont différents déclencheurs. Parmi les implémentations, NSOperation est probablement la plus "propre" de la solution, puisque vous avez un arbitraire de la file d'attente que vous pouvez regarder pour les opérations qui doivent être terminé et vous pouvez également annuler des opérations en cours. Plus bas dans l'échelle de hack serait un volatile emplacement de chacun de ces blocs de regarder à l'intérieur d'une boucle serrée, afin de déterminer s'ils vont terminer prématurément. Encore plus bas, serait une variable globale pour la même fonction de base.
À la fin, même la mise en œuvre de NSOperation de passer un test afin de sortir au même endroit (depuis simplement de tuer un thread peut entraîner des incohérences dans les données d'être opéré ou dans les allocations/retrains).
OriginalL'auteur gaige
La meilleure façon de le faire est de créer votre propre simultanées de la file d'attente (ne pas utiliser l'un de ceux global) et ensuite appeler dispatch_suspend() sur la file d'attente lorsque vous souhaitez arrêter le traitement. À ce point, lire ceci: Envoi des files d'attente: Comment savoir si ils sont en cours d'exécution et comment les arrêter
À l'aide d'une annulation du pavillon vous permettra de reprendre la file d'attente pour que tous les blocs restants fondamentalement juste à la sortie (après avoir fait ce que la gestion de la mémoire dont ils ont besoin à faire, c'est de libérer des ressources) lorsque vous reprenez à nouveau. Vous pouvez également dispatch_release() la file d'attente immédiatement après la reprise.
OriginalL'auteur jkh