web-dev-qa-db-fra.com

NSOperation sur l'iPhone

Je cherchais des scénarios concrets pour quand NSOperation sur iPhone est un outil idéal à utiliser dans une application. À ma connaissance, il s'agit d'un wrapper autour de l'écriture de votre propre code threaded. Je n'ai vu aucune application de démonstration Apple Apple l'utilisant, et je me demande si je manque un excellent outil au lieu d'utiliser NSThread.

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

41
Coocoo4Cocoa

Cocoa Is My Girlfriend a un bon tutoriel sur l'utilisation de NSOperation et NSOperationQueue. Le didacticiel utilise NSOperation pour télécharger plusieurs pages Web simultanément dans des threads séparés.

Voir aussi cet article de Mac Research.

43
e.James

La façon dont je l'utilise dans mes applications iPhone consiste essentiellement à créer un membre NSOperationQueue dans mon délégué d'application et à le rendre disponible via une propriété. Ensuite, chaque fois que je dois exécuter quelque chose en arrière-plan, par exemple télécharger du XML, je vais juste créer un NSInvocationOperation et l'envoyer à la queque.

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

En un mot: NSOperationQueue

NSOperationQueue est sûr pour les threads (vous pouvez y ajouter des opérations à partir de différents threads sans avoir besoin de verrous) et vous permet de chaîner des objets NSOp ensemble.

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

Mise en garde: assurez-vous de lire, relire et comprendre ce que les documents signifient lorsqu'ils parlent de "concurrence".

10
user102560

Vous devriez également vérifier cette URL: http://developer.Apple.com/cocoa/managingconcurrency.html

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

if ( self.isCancelled ) return;

Cette ligne n'a pas été utilisée dans les exemples fournis par Coca is my Girlfriend, et ce n'est que lorsque j'ai reçu des journaux de plantage sur le terrain que j'ai réalisé qu'il s'agissait d'un problème/concept.

6
esilver

Voici juste une implémentation 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];
5
Flea

Je l'utilise pour le traitement asynchrone. C'est le meilleur moyen d'obtenir des données à partir de services Web ou de coordonner des actions qui prennent beaucoup de temps à s'exécuter. Parce qu'ils sont sûrs pour les threads, asynchrones (n'attache pas le thread principal) et qu'ils prennent en charge les dépendances, ils sont vraiment un excellent outil pour votre ensemble d'outils.

Les dépendances vous permettent d'effectuer plusieurs opérations distinctes et de vous assurer que l'exécution et la réussite ou l'erreur se produisent dans un certain ordre. C'est vraiment génial lorsque vous devez synchroniser un tas de données mais que vous avez besoin des objets parents à synchroniser avant de synchroniser les objets enfants.

1
ddorrity

Un échantillon que vous pouvez essayer d'utiliser Swift

let operation : NSOperation = NSOperation()
operation.completionBlock = {
println("Completed")
}

let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)
1
Govind