Recevez une notification lorsque NSOperationQueue finitions de toutes les tâches
NSOperationQueue
a waitUntilAllOperationsAreFinished
, mais je ne veux pas attendre de façon synchrone pour elle. Je tiens juste à masquer l'indicateur de progression dans l'INTERFACE utilisateur lorsque la file d'attente de finitions.
Quelle est la meilleure façon d'accomplir cette?
Je ne peux pas envoyer des notifications à partir de mon NSOperation
s, parce que je ne sais pas ce qui va être le dernier, et [queue operations]
peut-être pas encore vide (ou pire encore, repeuplé) lorsque la notification est reçue.
- Cochez cette case si vous utilisez PGCD rapide 3. stackoverflow.com/a/44562935/1522584
Vous devez vous connecter pour publier un commentaire.
Utilisation KVO d'observer la
operations
propriété de votre file d'attente, alors vous pouvez dire si votre attente est terminée en recherchant pour[queue.operations count] == 0
.Quelque part dans le fichier que vous êtes en train de faire le KVO en, déclarer un contexte pour le KVO comme ceci (plus d'infos):
Lorsque vous configurez votre file d'attente, ce faire:
Puis le faire dans votre
observeValueForKeyPath
:(C'est en supposant que votre
NSOperationQueue
est dans une propriété nomméequeue
)À un certain point avant votre objet entièrement deallocs (ou quand il arrête de s'inquiéter de la file d'attente de l'état), vous aurez besoin de vous désinscrire de KVO comme ceci:
Addendum: iOS 4.0 dispose d'une
NSOperationQueue.operationCount
de la propriété, qui, selon les docs KVO est conforme. Cette réponse sera toujours en iOS 4.0 cependant, il est donc toujours utile pour assurer la compatibilité ascendante.operationCount
sur le mêmeNSOperationQueue
objet potentiellement conduire à des bugs, dans ce cas, vous devez utiliser le contexte argument correctement. Il est peu probable de se produire, mais certainement possible. (En prononçant le problème réel est plus utile que l'ajout de snark + un lien)addObserver:
avec un appel àremoveObserver:
.Si vous vous attendez (ou désireux) quelque chose qui correspond à ce comportement:
Vous devez être conscient que si un certain nombre de "court" opérations sont ajoutés à une file d'attente, vous pouvez voir ce comportement de la place (parce que les opérations sont lancées dans le cadre d'être ajouté à la file d'attente):
Dans mon projet j'ai besoin de savoir, lors de la dernière opération réalisée, après un grand nombre d'opérations ont été ajoutés à une série NSOperationQueue (c'est à dire, maxConcurrentOperationCount=1) et que lorsqu'ils avaient terminé.
Recherche sur google j'ai trouvé cette déclaration d'un des développeurs d'Apple en réponse à la question "est une série NSoperationQueue FIFO?" --
Dans mon cas, il est possible de savoir quand la dernière opération a été ajouté à la file d'attente. Ainsi, après la dernière opération est ajouté, j'ai ajouter une autre opération pour la file d'attente de priorité plus faible, qui ne fait rien mais envoyer la notification que la file d'attente avait été vidé. Étant donné qu'Apple a énoncé, ce qui assure qu'un seul avis est envoyé uniquement après que toutes les opérations ont été achevées.
Si les opérations sont ajoutés de manière à ne pas permettre la détection de la dernière, (c'est à dire, non-déterministe) alors je pense que vous devez aller avec le KVO approches mentionnées ci-dessus, avec en plus la garde logique ajoutée pour essayer de détecter si d'autres opérations peuvent être ajoutées.
🙂
Que diriez-vous d'un NSOperation qui dépend de tous les autres, de sorte qu'il sera exécuté dernière?
Une alternative est d'utiliser le PGCD. Reportez-vous à cette comme référence.
C'est comment je le fais.
Ensemble de la file d'attente, et de s'inscrire à des changements dans la propriété des opérations:
...et l'observateur (dans ce cas
self
) met en œuvre:Dans cet exemple "spinner" est un
UIActivityIndicatorView
montrant que quelque chose se passe. Vous pouvez bien évidemment changer en fonction de...for
boucle semble potentiellement coûteux (si vous annulez toutes les opérations à la fois? Ne serait-ce pas obtenir quadratique de la performance lors de la file d'attente est nettoyé?)Que sur l'utilisation de KVO d'observer la
operationCount
propriété de la file d'attente? Vous devez alors entendre à ce sujet lorsque la file d'attente est allé à vide, et aussi quand il a cessé d'être vide. Traiter avec l'indicateur de progression pourrait être aussi simple que juste de faire quelque chose comme:NSOperationQueue
de 3,1 se plaint qu'il n'est pas KVO-conformes pour la cléoperationCount
.operationCount
propriété est présent.Ajouter de la dernière opération comme:
Donc:
Avec ReactiveObjC je trouve que cela fonctionne bien:
Pour info,Vous pouvez réaliser cela avec PGCD dispatch_group dans swift 3. Vous pouvez être averti lorsque toutes les tâches sont terminées.
Je suis en utilisant une catégorie pour ce faire.
NSOperationQueue+D'Achèvement.h
NSOperationQueue+D'Achèvement.m
Utilisation:
Source: https://gist.github.com/artemstepanenko/7620471
waitUntilFinished
devrait êtreYES
Vous pouvez créer un nouveau
NSThread
, ou d'exécuter un sélecteur en arrière-plan, et d'attendre là. Lorsque leNSOperationQueue
finitions, vous pouvez envoyer une notification de votre propre.Je suis en train de penser à quelque chose comme:
Si vous utilisez cette L'opération que votre classe de base, vous pouvez passer
whenEmpty {}
bloc à la OperationQueue:Sans KVO