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.
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.
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];
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".
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.
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];
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.
Un échantillon que vous pouvez essayer d'utiliser Swift
let operation : NSOperation = NSOperation()
operation.completionBlock = {
println("Completed")
}
let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)