41 votes

NSOperation sur l'iPhone

J'ai cherché des scénarios concrets pour quand NSOperation sur l'iPhone est un outil idéal à utiliser dans une application. D'après ce que j'ai compris, il s'agit d'une enveloppe permettant d'écrire ses propres threaded code. Je n'ai pas vu d'applications de démonstration Apple l'utilisant, et je me demande si je ne passe pas à côté d'un outil formidable au lieu d'utiliser NSThread .

La solution idéale ici serait de décrire un scénario d'utilisation pour NSOperation et comment vous l'utiliseriez pour résoudre votre ou vos problèmes.

43voto

e.James Points 51680

Cocoa Is My Girlfriend a un bon tutoriel sur l'utilisation de NSOperation y NSOperationQueue . Le tutoriel fait appel à NSOperation pour télécharger plusieurs pages web simultanément dans des fils séparés.

Voir aussi cet article de Mac Research.

33voto

nduplessis Points 7777

La façon dont je l'utilise dans mes applications iPhone consiste à créer un membre NSOperationQueue dans le délégué de mon application et à le rendre disponible par le biais d'une propriété. Ensuite, chaque fois que j'ai besoin d'exécuter quelque chose en arrière-plan, par exemple télécharger du XML, je crée simplement une NSInvocationOperation et l'envoie à la file d'attente.

NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil];
[[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:updateOperation];
[op release];

10voto

En un mot : NSOperationQueueue

NSOperationQueue est thread safe (vous pouvez y ajouter des opérations depuis différents threads sans avoir besoin de verrous) et vous permet de chaîner des objets NSOp entre eux.

Mon application iPhone Flickr, Reflections, utilise largement NSOperation et NSOperationQueue pour gérer le téléchargement des images et du XML.

Avertissement : Assurez-vous de lire, relire et comprendre ce que les documents signifient lorsqu'ils parlent de "concurrence".

6voto

esilver Points 7768

Vous devriez également consulter cette URL : http://developer.apple.com/cocoa/managingconcurrency.html

Toutes ces réponses sont excellentes, mais assurez-vous de lire l'article ci-dessus et d'utiliser librement cette ligne dans votre code :

if ( self.isCancelled ) return;

Cette ligne n'était pas utilisée dans les échantillons fournis par Coca is my Girlfriend, et ce n'est que lorsque j'ai reçu les rapports d'accident du terrain que j'ai réalisé que c'était un problème/concept.

5voto

Flea Points 3308

Voici une mise en œuvre très simple, mais prenez le temps de lire les tutoriels pour tout comprendre :

NSOperationQueue *queue = [NSOperationQueue new];

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
    selector:@selector(methodToCall)
    object:objectToPassToMethod];

[queue addOperation:operation];

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