En accord avec ma réponse à une question connexe Je ne suis pas d'accord avec BJ et je vous suggère de regarder d'abord GCD plutôt que NSOperation / NSOperationQueue, à moins que ce dernier n'offre quelque chose dont vous avez besoin et que GCD n'offre 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 de façon régulière, j'ai presque entièrement remplacé les NSOperations et les NSOperationQueues par des blocs et des files d'attente de distribution. Cela vient de la façon dont j'ai utilisé ces deux technologies dans la pratique, et du profilage que j'ai effectué sur elles.
Tout d'abord, l'utilisation de NSOperations et de NSOperationQueuesues entraîne une surcharge non négligeable. Ce sont des objets Cocoa, et ils doivent être alloués et désalloués. Dans une application iOS que j'ai écrite et qui rend une scène 3D à 60 FPS, j'utilisais NSOperations pour encapsuler chaque image rendue. Lorsque j'ai établi le profil de cette application, j'ai constaté que la création et le démontage de ces NSOperations représentaient une part importante des cycles CPU de l'application en cours d'exécution, ce qui ralentissait les choses. Je les ai remplacées par de simples blocs et une file d'attente série GCD, et cette surcharge a disparu, ce qui a permis d'améliorer sensiblement les performances de rendu. Ce n'est pas le seul endroit où j'ai remarqué une surcharge due à l'utilisation de NSOperations, et j'ai constaté ce phénomène sur Mac et iOS.
Deuxièmement, il y a une élégance dans le code de répartition basé sur des blocs qu'il est difficile d'égaler en utilisant NSOperations. Il est incroyablement pratique d'envelopper quelques lignes de code dans un bloc et de le répartir pour qu'il soit exécuté sur une file d'attente série ou concurrente, alors que la création d'une NSOperation ou d'une NSInvocationOperation personnalisée pour ce faire nécessite beaucoup plus de code de soutien. Je sais que vous pouvez utiliser une NSBlockOperation, mais vous pourriez tout aussi bien envoyer quelque chose à GCD dans ce cas. Envelopper ce code dans des blocs en ligne avec le traitement connexe dans votre application conduit, à mon avis, à une meilleure organisation du code que d'avoir des méthodes séparées ou des NSOperations personnalisées qui encapsulent ces tâches.
NSOperations et NSOperationQueues ont encore de très bons usages. GCD n'a pas de réel concept de dépendances, alors que NSOperationQueues peut mettre en place des graphes de dépendances assez complexes. J'utilise NSOperationQueues pour cela dans une poignée de cas.
Dans l'ensemble, bien que je préconise généralement l'utilisation du plus haut niveau d'abstraction permettant d'accomplir la tâche, il s'agit d'un cas où je plaide en faveur de l'API de niveau inférieur de GCD. Parmi les développeurs iOS et Mac avec lesquels j'ai discuté de ce sujet, la grande majorité choisit d'utiliser GCD plutôt que NSOperations, à moins qu'ils ne visent des versions du système d'exploitation qui ne le prennent pas en charge (celles antérieures à iOS 4.0 et Snow Leopard).
11 votes
+1 pour la bonne question - curieux des résultats. Jusqu'à présent, j'ai juste lu que GCD peut facilement être distribué à travers les cœurs du CPU, ce qui en fait la "nouvelle merde chaude".
3 votes
Une discussion à ce sujet peut être trouvée dans cette question : Pourquoi devrais-je choisir GCD plutôt que NSOperation et blocs pour les applications de haut niveau ?
1 votes
cocoacasts.com/