iphone objective-c cocoa-touch multithreading nsoperation

NSOperation en el iPhone



objective-c cocoa-touch (7)

He estado buscando algunos escenarios concretos para cuando NSOperation en el iPhone es una herramienta ideal para usar en una aplicación. A mi entender, esto es un envoltorio para escribir su propio código threaded . No he visto aplicaciones de demostración de Apple que lo usen, y me pregunto si me estoy perdiendo una gran herramienta en lugar de usar NSThread .

La solución ideal aquí sería describir un escenario de caso de uso para NSOperation y cómo lo usaría para resolver su (s) problema (s).


Aquí hay solo una implementación muy simple, pero tómese el tiempo para leer los tutoriales para comprender completamente todo:

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


Cocoa Is My Girlfriend tiene un buen tutorial sobre el uso de NSOperation y NSOperationQueue . El tutorial utiliza NSOperation para descargar varias páginas web simultáneamente en hilos separados.

Además, vea este artículo de Mac Research.


En una palabra: NSOperationQueue

NSOperationQueue es seguro para subprocesos (puede agregarle operaciones desde diferentes subprocesos sin necesidad de bloqueos) y le permite encadenar objetos NSOp.

La aplicación de mi iPhone de Flickr, Reflections, usa NSOperation y NSOperationQueue extensivamente para administrar la descarga de imágenes y XML .

Advertencia: asegúrese de leer, volver a leer y entender qué significan los documentos cuando hablan de ''concurrencia''.


La forma en que lo uso en mis aplicaciones para iPhone es básicamente crear un miembro NSOperationQueue en mi delegado de aplicaciones y ponerlo a disposición a través de una propiedad. Luego, cada vez que necesite ejecutar algo en segundo plano, por ejemplo, descargue un poco de XML, solo crearé una NSInvocationOperation y la enviaré a la queque.

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


Lo uso para el procesamiento asincrónico. Es la mejor forma de obtener datos de los servicios web o coordinar acciones que requieren mucho tiempo para ejecutarse. Debido a que son seguros para subprocesos, asíncronos (no vinculan el hilo principal) y admiten dependencias, son una gran herramienta para su conjunto de herramientas.

Las dependencias le permiten realizar varias operaciones por separado y asegurarse de que la ejecución y el éxito o el error se realicen en un orden determinado. Esto es realmente genial cuando necesita sincronizar una gran cantidad de datos, pero necesita objetos padre para sincronizar antes de sincronizar los objetos secundarios.


También debe consultar esta URL: http://developer.apple.com/cocoa/managingconcurrency.html

Todas estas respuestas anteriores son excelentes, pero asegúrese de leer el artículo anterior y hacer un uso liberal de esta línea en su código:

if ( self.isCancelled ) return;

Esa línea no se usó en las muestras proporcionadas por Coca is my Girlfriend, y no fue hasta que recibí los registros de fallas del campo que me di cuenta de que esto era un problema / concepto.


Una muestra que puedes probar usando Swift

let operation : NSOperation = NSOperation() operation.completionBlock = { println("Completed") } let operationQueue = NSOperationQueue.mainQueue() operationQueue.addOperation(operation)