2009-05-06 10 views
41

He estado buscando algunos escenarios concretos para cuando el 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.NSOperation en el iPhone

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).

+22

Es posible que desee considerar la selección de uno de estos excelentes respuestas como la solución. (: – corydoras

Respuesta

43

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

También, vea this article de Mac Research.

+0

Hay otro tutorial aquí: http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/ – wbyoung

+0

También sugiero repasar los materiales de la clase Standord. Hacen un uso extensivo de NSOperation para sincronizar la carga de imágenes en el ejemplo de flickr. Están disponibles en iTunes gratis. – Jab

10

En una palabra: NSOperationQueue

NSOperationQueue es seguro para hilos (se puede añadir operaciones a ella desde diferentes hilos sin la necesidad de bloqueos) y le permite a la cadena NSOp objetos juntos.

Mi aplicación de Flickr para iPhone, Reflections, usa NSOperation y NSOperationQueue para administrar las imágenes de descarga y XML.

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

+2

En realidad, no es * realmente * seguro para los hilos, hay un problema con él en Mac OS X 10.5. Consulte http://www.mikeash.com/?page=pyblog/dont-use-nsoperationqueue.html. Aunque mencionan que el iPhone parece ser inmune a él debido al procesador de un solo núcleo – nduplessis

+2

Como actualización, http://www.mikeash.com/pyblog/use -nsoperationqueue.html fue una continuación del enlace en el comentario de @nduplessis que señala que 10.5.7 ha corregido los problemas mencionados. Por lo tanto, NSOperationQueue probablemente ya no tenga subprocesos. –

33

La forma en que lo uso en las aplicaciones de mi iPhone es básicamente crear un miembro NSOperationQueue en mi delegado de aplicación y ponerlo a disposición a través de una propiedad. Luego, cada vez que necesito ejecutar algo en segundo plano, p. Descargue un poco de XML. Solo crearé una NSInvocationOperation y la enviaré al queque.

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

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

Todas estas respuestas anteriores son grandes, pero asegúrese de leer el artículo anterior y hacer uso libre 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 fallos del campo que me di cuenta de que esto era un problema/concepto.

+0

¿Puedes explicar qué hace exactamente esta línea? ? y dónde debería poner en el código? – JAHelia

+1

Comprueba si la operación se ha cancelado y sale antes si es así. – esilver

5

aquí es sólo una implementación muy simple, pero toma tiempo para leer los tutoriales para entender completamente todo:

NSOperationQueue *queue = [NSOperationQueue new]; 

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

[queue addOperation:operation]; 
1

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.

1

Un ejemplo que se puede tratar de usar Swift

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

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