web-dev-qa-db-fra.com

(iOS) dispatch_async () contre 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 ces deux cas, ils recommandent d'utiliser dispatch_async(), dispatch_get_main_queue(), etc. pour gérer le threading et les opérations simultanées. Cependant, lors de la session de la 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) pour laquelle je devrais utiliser l'une par rapport à l'autre? NSOperationQueue est-il simplement un wrapper Objective-C autour de dispatch_async, ou y a-t-il plus que cela?

49
Donald Burr

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

La règle de base est la suivante: Utilisez d'abord l'api du plus haut niveau, puis dégradez en fonction de ce que vous devez accomplir.

L'avantage de cette approche est que votre code reste 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 d'Apple de la file d'attente d'exécution (à l'aide de GCD). Si Apple décide jamais de modifier les détails de l'implémentation en arrière-plan, ils peuvent le faire sans casser le code de votre application.
Un tel exemple serait Apple déprécier GCD et utiliser une bibliothèque complètement différente (ce qui est peu probable car Apple créé GCD et tout le monde semble aimer) il).

Concernant la question, je recommande de consulter les ressources suivantes:

Maintenant, concernant vos questions spécifiques:

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

Voir au dessus.

[...] et y a-t-il une raison (technique, de performance, stylistique ou autre) que je devrais utiliser l'une par rapport à l'autre?

Si le truc 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. De plus, des fonctionnalités telles que les dépendances de fonctionnement, un démarrage/arrêt facile.

Amendement

Pour dire, utiliser d'abord l'API de plus haut niveau peut sembler intrigant. Bien sûr, si vous avez besoin d'un moyen rapide d'exécuter du code sur un thread spécifique, vous ne voulez pas écrire beaucoup de code passe-partout qui rend l'utilisation des fonctions C de niveau inférieur parfaitement valide:

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 écrirez est de toute façon Objective-C, alors pourquoi ne pas embrasser son expressivité?

75
glasz

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 file d'attente de répartition globale pour exécuter ses opérations asynchrones mais n'utilise autrement aucune autre fonctionnalité GCD).

NSOperationQueue possède des capacités supplémentaires non fournies par GCD, mais si vous n'en avez pas besoin, l'utilisation de GCD vous donnera de meilleures performances.

10
das

Ils font tous les deux la même chose, mais la principale différence entre eux est que nous pouvons annuler la tâche si nous voulons tout en utilisant NSOperation alors que si nous utilisons GCD, puis une fois que nous assignons la tâche à la file d'attente, nous ne pouvons pas l'annuler.

10
Mehul Thakkar

En plus de la réponse ci-dessus, l'autre avantage de la file d'attente NSOperation sur GCD est

1) Dépendances: - Nous pouvons mettre en place une dépendance entre deux NSOperations l'opération ne démarrera pas jusqu'à ce que toutes ses dépendances retournent true pour fini.

2) État de fonctionnement: - Nous pouvons surveiller l'état d'une opération ou d'une file d'attente d'opérations. Prêt, en cours d'exécution ou terminé

3) Nombre maximal d'opérations: - Nous pouvons spécifier le nombre maximal d'opérations en file d'attente pouvant s'exécuter simultanément

1
Ankit garg