28 votes

NSThread vs NSOperationQueue vs ??? sur l'iPhone

Actuellement, je suis en utilisant NSThread cache des images dans un autre thread.

[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image];

Alternativement:

[self performSelectorInBackground:@selector(cacheImage:) withObject:image];

Sinon, je peux utiliser un NSOperationQueue

NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image];
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation:invOperation];

Est-il une raison pour passer à partir de NSThread? PGCD est une 4ème option quand il sortira pour l'iPhone, mais si il y a un gain de performance significatif, je préfère rester avec les méthodes de travail dans la plupart des plates-formes.


Basé sur @Jon-Eric conseils, je suis allé avec un NSOperationQueue/NSOperation sous-classe de la solution. Il fonctionne très bien. L' NSOperation classe est suffisamment flexible que vous pouvez l'utiliser avec des invocations, des blocs personnalisés ou sous-classes, en fonction de vos besoins. Peu importe la façon dont vous créez votre NSOperation vous pouvez simplement le jeter dans une opération de la file d'attente lorsque vous êtes prêt à l'exécuter. Les activités sont conçues pour fonctionner soit comme des objets que vous mettez dans une file d'attente ou vous pouvez les exécuter de manière autonome des méthodes asynchrones, si vous le souhaitez. Puisque vous pouvez facilement exécuter votre personnalisé méthodes d'opération de façon synchrone, le test est trivial.

J'ai utilisé cette même technique dans une poignée de projets depuis que j'ai posé cette question et je ne pouvais pas être plus heureux avec la façon dont elle garde mon code et mes tests, propre, organisé et heureusement asynchrone.

Un++++++++++ Serait sous-classe de nouveau

31voto

Jon-Eric Points 7749

En général, vous obtiendrez un meilleur kilométrage avec NSOperationQueue.

Trois raisons:

  • Vous pouvez lancer la mise en cache de nombreux éléments à la fois. NSOperationQueue est assez intelligent pour seulement créer autant de threads qu'il y a des carottes, des files le reste des opérations. Avec NSThread, la création de 100 threads cache de 100 images est probablement exagéré, et quelque peu inefficace.
  • Vous pouvez annuler l' cacheImage de l'opération. La mise en œuvre de l'annulation est plus facile avec NSOperationQueue; la plupart du travail est déjà fait pour vous.
  • NSOperationQueue est libre de passer à une solution plus intelligente de mise en œuvre (comme le Grand Central Dispatch), maintenant ou dans l'avenir. NSThread plus susceptibles d'être toujours juste l'un thread de système d'exploitation.

Bonus:

  • NSOperationQueue a quelques autres belles constructions intégrées, comme une manière sophistiquée d'honorer le fonctionnement des priorités et des dépendances.

5voto

shosti Points 4672

Je voudrais utiliser NSOperationQueue. En vertu de l'OS 3.2, NSOperationQueue utilise des threads sous le capot, donc, les deux méthodes doivent effectuer de la même façon. Cependant, sous Mac OS 10.6, NSOperationQueue utilise GCD sous le capot et a donc l'avantage de ne pas avoir la surcharge des threads séparés. Je n'ai pas regardé les docs pour OS 4, mais je soupçonne qu'il fait quelque chose de similaire--en tout cas, NSOperationQueue pourraient s'échanger des implémentations si/lorsque les avantages de performance de PGCD deviennent disponibles pour l'iPhone.

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