Conformément à ma réponse à une question connexe , je vais être en désaccord avec BJ et vous suggérer d'abord de regarder GCD sur NSOperation / NSOperationQueue, à moins que ce dernier ne fournisse quelque chose dont vous avez besoin que GCD ne fait pas.
Avant GCD, j'utilisais beaucoup de NSOperations / NSOperationQueues dans mes applications pour gérer la concurrence. Cependant, depuis que j'ai commencé à utiliser GCD régulièrement, j'ai presque entièrement remplacé NSOperations et NSOperationQueues par des blocs et des files d'attente de répartition. Cela vient de la façon dont j'ai utilisé les deux technologies dans la pratique et du profilage que j'ai effectué sur elles.
Tout d'abord, il y a une quantité non négligeable de frais généraux lors de l'utilisation de NSOperations et NSOperationQueues. Ce sont des objets Cocoa, et ils doivent être alloués et désalloués. Dans une application iOS que j'ai écrite qui rend une scène 3D à 60 FPS, j'utilisais NSOperations pour encapsuler chaque image rendue. Lorsque j'ai présenté ce profil, la création et la suppression de ces NSOperations représentaient une partie importante des cycles du processeur dans l'application en cours d'exécution et ralentissaient les choses. J'ai remplacé ceux-ci par de simples blocs et une file d'attente série GCD, et cette surcharge a disparu, conduisant à des performances de rendu sensiblement meilleures. Ce n'était pas le seul endroit où j'ai remarqué des frais généraux en utilisant NSOperations, et je l'ai vu sur Mac et iOS.
Deuxièmement, le code de répartition basé sur des blocs est d'une élégance difficile à égaler lors de l'utilisation de NSOperations. Il est si incroyablement pratique d'envelopper quelques lignes de code dans un bloc et de le distribuer pour qu'il soit exécuté sur une file d'attente série ou simultanée, où la création d'une NSOperation ou NSInvocationOperation personnalisée pour ce faire nécessite beaucoup plus de code de prise en charge. Je sais que vous pouvez utiliser un NSBlockOperation, mais vous pourriez aussi bien envoyer quelque chose à GCD. Envelopper ce code dans des blocs en ligne avec le traitement associé dans votre application conduit à mon avis à une meilleure organisation du code que d'avoir des méthodes distinctes ou des NSOperations personnalisées qui encapsulent ces tâches.
NSOperations et NSOperationQueues ont toujours de très bonnes utilisations. GCD n'a pas de véritable concept de dépendances, où NSOperationQueues peut configurer des graphiques de dépendance assez complexes. J'utilise NSOperationQueues pour cela dans une poignée de cas.
Dans l'ensemble, alors que je préconise généralement d'utiliser le niveau d'abstraction le plus élevé qui accomplit la tâche, c'est un cas où je plaide pour l'API de niveau inférieur de GCD. Parmi les développeurs iOS et Mac avec lesquels j'ai parlé de cela, la grande majorité choisit d'utiliser GCD sur NSOperations à moins qu'ils ne ciblent des versions de système d'exploitation sans prise en charge (celles avant iOS 4.0 et Snow Leopard).