NSOperationQueue de série de la file d'attente FIFO
Est-il possible d'utiliser un NSoperationQueue
objet comme une série de file d'attente FIFO par l'établissement de ses maxConcurrentOperationCount
à 1?
Je note que le docs état...
Pour une file d'attente dont le nombre maximal d'opérations simultanées est mis à 1, ce qui équivaut à une série de file d'attente. Cependant, vous ne devez jamais compter sur le numéro de série de l'exécution de l'opération objets.
Est-ce à dire que la FIFO d'exécution n'est pas garanti?
OriginalL'auteur Barjavel | 2012-06-08
Vous devez vous connecter pour publier un commentaire.
Dans la plupart des cas, il sera FIFO. Toutefois, vous pouvez configurer les dépendances entre les NSOperations tels qu'une opération soumise tôt on va laisser les autres opérations de passer par la file d'attente jusqu'à ce que ses dépendances sont satisfaites.
Cette gestion de la dépendance est pourquoi les docs indiquent que FIFO-ness ne peut pas être garantie. Si vous n'utilisez pas les dépendances, même si, vous devriez être bien compter sur elle.
Mise à jour:
NSOperation a aussi un
queuePriority
de la propriété, qui peut également causer des opérations à exécuter dans le non-FIFO commande. La plus haute priorité de l'opération sans l'attente de dépendances sera toujours exécuté en premier.Un NSOperation sous-classe peut également remplacer
-isReady
, ce qui pourrait entraîner un retour dans la file d'attente.Afin d'exécution sur votre file d'attente est garanti d'être série, qu'une seule opération à la fois dans cette file d'attente. Mais Apple ne peut pas garantir FIFO; cela dépend de ce que vous êtes en train de faire avec les opérations que vous mettez dans.
Très vrai. Mis à jour.
Donc, si mon opération, tous ont la même priorité, n'ont pas de dépendances et ne comptent que sur la super-classe de mise en œuvre de
isReady
(je n'ai pas l'ignorer) il devrait en résulter une file d'attente FIFO?Correct; NSOperationQueue seulement réorganise les choses si vous lui donner une raison de le faire. Si vous ne le faites pas tout de ces choses, il faut juste dans l'ordre.
Et si j'ai un tas de fonctionnement que je veux exécuter à mainqueue en série? Réglage de la maxConcurrentOperationCount à 1 de mainqueue peut provoquer agitée de l'interface.
OriginalL'auteur BJ Homer
La file d'attente FIFO, comme mentionné par la documentation. Vous pouvez le faire strictement FIFO si vous assurer que toute nouvelle opération dépend de la dernière opération a ajouté à la file d'attente et qu'il ne peut exécuter qu'une seule opération à la fois. Omar solution est correcte, mais plus généralement, vous pouvez effectuer les opérations suivantes:
Cela fonctionne parce que la file d'attente.des opérations est un tableau: tout ce que vous ajoutez est pas réorganisées (il n'est pas un NSSet par exemple). Vous pouvez aussi tout simplement ajouter une catégorie pour votre NSOperationQueue:
et l'utilisation [de la file d'attente addOperationAfterLast:myOperation]. queuePriority n'a rien à voir avec FIFO, il est lié à la planification de tâches.
Edit: suite à un commentaire ci-dessous, de la suspension de la file d'attente si la vérification de la valeur de comptage est pas suffisant. Je crois que cette forme est très bien (lors d'un test, ce n'est pas de créer une situation de concurrence et de ne pas tomber en panne).
Quelques infos: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/#//apple_ref/occ/instp/NSOperationQueue/suspended
Bon point, je ne vois pas qui, mais oui: si les opérations.le comte est activée lorsque la file d'attente s'exécute, il peut mettre fin alors que nous entrons dans la condition if. Je crois que la modification est meilleur et plus sûr : (les tests ici de ne pas tomber en panne, tout en ay tentative de suspendre la file d'attente ne fonctionne pas (non illustré)).
C'est la solution que j'ai est venu trop; créer une variable locale, la prévention de la NSOperation d'être publié.
suspendre la file d'attente lors de l'ajout de toutes les opérations.
Cela fonctionnerait-il? Je pense que quand vous suspendre une opération de la file d'attente, il ne sera pas commencer de nouvelles opérations, mais toutes les opérations qui sont en cours d'exécution continuera. Si c'est le cas, alors la suspension de la file d'attente n'empêche pas la dernière opération à partir de la fin après la
queue.operations.count
vérifier? Donc, le problème restera.OriginalL'auteur Daniel
De faire une simple FIFO utilisation de nsInvocationopration
Vous aurez besoin de définir une opération à compter sur les autres
À l'aide de addDependency: méthode
Note: si vous utilisez
NSInvocationOperation
, puis en réglant lesmaxConcurrentOperationCount
à 1 seraient le plus susceptibles de faire l'affaire pour vous, depuis isReady ne sera pas modifiable par vousMais
maxConcurrentOperationCount
= 1 ne serait pas une bonne solution si vous êtes le rabotage de créer votre propre sous-classes deNSOperation
Depuis dans NSOperation dérivés, vous pourriez remplacer le
isReady
fonction et retour pas, (imaginez une opération qui aurait besoin d'attendre des données à partir d'un serveur pour fonctionner correctement) dans ces cas, vous seriez de retourisReady no
jusqu'à ce que vous êtes vraiment prêtDans ces cas, vous aurez besoin d'ajouter
dependencies
entreoperations
à l'intérieur de la file d'attenteD'apple docs cela équivaut à une série de file d'attente. Cependant, vous ne devez jamais compter sur l'exécution en série de fonctionnement des objets. Les changements dans la préparation d'une opération peut modifier les résultats d'exécution de l'ordre
j'ai mis à jour ma réponse à inclure certains enregistrement
Votre file d'attente dans l'exemple n'a pas
maxConcurrentOperationCount = 1
comme l'OP spécifié. Cela est-il encore se passer avec ce jeu?Dans cet exemple, il le sentait, mais pensez plutôt à la plus grande opération où vous auriez besoin de sous-classe NSOperation et remplacer isReady, et votre mise en œuvre de isReady peut renvoyer non, considérer le commentaire suivant dans la pomme docs ce qui équivaut à une série de file d'attente. Cependant, vous ne devez jamais compter sur l'exécution en série de fonctionnement des objets. Les changements dans la préparation d'une opération peut modifier les résultats d'exécution de commande
Ok, c'est un exemple valable. Mais votre réponse originale à cette question est totalement invalide;
NSInvocationOperation
ne fait rien de lui-même qui serait la cause de la non-FIFO ordre d'exécution.OriginalL'auteur Omar Abdelhafith