(iOS) dispatch_async () vs NSOperationQueue

J’ai appris la programmation iOS grâce au cours CS193p de Stanford (sur iTunes U) ainsi qu’au livre de programmation iOS de Big Nerd Ranch. Dans les deux cas, ils recommandent d’utiliser dispatch_async() , dispatch_get_main_queue() , etc. pour gérer les threads et les opérations simultanées. Cependant, lors de la session de WWDC 2012 sur la création d’une interface utilisateur simultanée, le conférencier a recommandé l’utilisation de NSOperationQueue .

Quelles sont les différences entre dispatch_*() et NSOperationQueue , et y a-t-il une raison (technique, performance, stylistique ou autre) que je devrais utiliser l’une sur l’autre? NSOperationQueue est- NSOperationQueue juste un wrapper Objective-C autour de dispatch_async , ou y a-t-il plus que cela?

NSOperation* classes NSOperation* sont les api de niveau supérieur. Ils cachent l’API de niveau inférieur de GCD afin que vous puissiez vous concentrer sur la tâche à accomplir.

La règle de base est la suivante: utilisez d’abord l’API du plus haut niveau et ensuite dégrader en fonction de ce que vous devez accomplir.

L’avantage de cette approche est que votre code rest le plus indépendant de l’implémentation spécifique fournie par le fournisseur. Dans cet exemple, en utilisant NSOperation , vous utiliserez l’implémentation de la mise en queue d’exécution d’Apple (à l’aide de GCD). Si Apple décidait un jour de modifier les détails de la mise en œuvre dans les coulisses, il peut le faire sans enfreindre le code de votre application.
Un exemple serait Apple dépréciant GCD et en utilisant une bibliothèque complètement différente (ce qui est peu probable car Apple a créé GCD et tout le monde semble l’aimer).

En ce qui concerne le sujet, je recommande de consulter les ressources suivantes:

Maintenant, en ce qui concerne vos questions spécifiques:

Quelles sont les différences entre dispatch _ * () et NSOperationQueue, […]

Voir au dessus.

[…] et y a-t-il une raison (technique, performance, stylistique ou autre) que je devrais utiliser l’une sur l’autre?

Si le NSOperation fait votre travail, utilisez-le.

NSOperationQueue est-il juste un wrapper Objective-C autour de dispatch_async, ou y a-t-il plus que cela?

Oui, c’est fondamentalement. Plus des fonctionnalités telles que les dépendances de fonctionnement, démarrage / arrêt faciles.

Amendement

Pour dire, utilisez d’abord l’api de plus haut niveau peut sembler insortinggant. Bien sûr, si vous avez besoin d’un moyen rapide d’exécuter du code sur un thread spécifique, vous ne souhaitez pas écrire beaucoup de code standard, ce qui rend parfaitement valide l’utilisation des fonctions de niveau C inférieur:

 dispatch_async(dispatch_get_main_queue(), ^{ do_something(); }); 

Mais considérez ceci:

 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ do_something(); }]; 

Je recommanderais ce dernier parce que la plupart de ce que vous allez écrire est Objective-C de toute façon alors pourquoi ne pas emarmser son expressivité?

NSOperationQueue est beaucoup plus lourd que dispatch_async (), il n’est basé que sur GCD de manière très limitée (il utilise essentiellement la queue globale pour exécuter ses opérations asynchrones mais n’utilise pas d’autres fonctionnalités GCD).

NSOperationQueue a des fonctionnalités supplémentaires non fournies par GCD, mais si vous n’en avez pas besoin, l’utilisation de GCD vous donnera de meilleures performances.

Ils font tous les deux la même chose, mais la principale différence est que nous pouvons annuler la tâche si nous voulons utiliser NSOperation alors que si nous utilisons GCD, une fois que nous avons assigné la tâche à la file, nous ne pouvons pas l’annuler.

Outre la réponse ci-dessus, l’autre avantage de la file d’attente NSOperation sur GCD est

1) Dépendances: – Nous pouvons définir une dépendance entre deux NSOperations, l’opération ne démarrera que lorsque toutes ses dépendances auront été vérifiées.

2) Etat de fonctionnement: – Nous pouvons surveiller l’état d’une file d’opérations ou d’opérations. Prêt, en cours d’exécution ou fini

3) Nombre maximum d’opérations: – Nous pouvons spécifier le nombre maximal d’opérations en queue pouvant être exécutées simultanément