49 votes

(iOS) dispatch_async () vs NSOperationQueue

J'ai appris iOS la programmation grâce à Stanford CS193p cours (sur iTunes U) ainsi que la programmation iOS livre de Big Nerd Ranch. Dans les deux de ces, ils recommandent d'utiliser des dispatch_async(), dispatch_get_main_queue(), etc. pour gérer le filetage et les opérations simultanées. Cependant, lors de la WWDC 2012 de la séance sur le développement simultané de l'INTERFACE utilisateur, l'orateur a recommandé l'utilisation de NSOperationQueue.

Quelles sont les différences entre dispatch_*() et NSOperationQueue, et est-il une raison technique, de performance, de style, ou autre) que je dois utiliser l'un plutôt que l'autre? Est - NSOperationQueue seulement Objective-C wrapper autour de dispatch_async, ou est-il plus que cela?

75voto

glasz Points 1243

NSOperation* des classes sont les plus élevés au niveau de l'api. Ils se cachent PGCD du niveau inférieur de l'api de vous afin que vous puissiez vous concentrer sur l'obtention de la tâche accomplie.

La règle de base est: l'Utilisation de l'api de haut niveau tout d'abord, et ensuite se dégrader basé sur ce que vous devez accomplir.

L'avantage de cette approche est que votre code reste plus agnostique à la mise en œuvre spécifique du vendeur. Dans cet exemple, à l'aide de NSOperation, vous serez à l'aide d'Apple de mise en œuvre de l'exécution des files d'attente (à l'aide de GCD). Apple devrait jamais décider de changer les détails de la mise en œuvre en coulisses, ils peuvent le faire sans casser le code de votre application.
Un exemple serait d'Apple autodérision PGCD et à l'aide d'un de complètement différent de la bibliothèque (ce qui est peu probable parce que Apple a créé PGCD et tout le monde semble l'aimer).

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

Maintenant, concernant vos questions:

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

Voir ci-dessus.

[...] et est-il une raison technique, de performance, de style, ou autre) que je dois utiliser l'un plutôt que l'autre?

Si l' NSOperation de substance devient de votre travail, utilisez-le.

Est NSOperationQueue juste un Objectif-C wrapper autour de dispatch_async, ou est-il plus que cela?

Oui, il est fondamentalement. Plus de fonctionnalités comme l'opération de dépendances, easy start/stop.

Amendement

À-dire, d'utiliser le plus haut niveau de l'api d'abord peut sembler intrigante. Bien sûr, si vous avez besoin d'un moyen rapide pour exécuter du code sur un thread spécifique, vous ne voulez pas écrire beaucoup de code réutilisable, ce qui rend l'utilisation de niveau inférieur en C fonctionne parfaitement valide:

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

Mais considérez ceci:

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

Je vous recommande le dernier parce que la plupart de ce que vous écrivez est Objective-C de toute façon, alors pourquoi ne pas embrasser son expressivité?

11voto

das Points 2015

NSOperationQueue est beaucoup plus lourd que dispatch_async (), il est uniquement basé sur GCD de manière très limitée (essentiellement, il utilise uniquement la file d'attente de dispatch globale pour exécuter ses opérations asynchrones mais n'utilise par ailleurs aucune autre fonctionnalité GCD).

NSOperationQueue possède 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.

10voto

Mehul Thakkar Points 1165

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X