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é?