iphone nsthread nsoperationqueue grand-central-dispatch

NSThread vs. NSOperationQueue vs. ??? en el iPhone



grand-central-dispatch (2)

En general, obtendrá un mejor kilometraje con NSOperationQueue .

Tres razones específicas:

  • Es posible que desee iniciar el almacenamiento en caché de muchos elementos a la vez. NSOperationQueue es lo suficientemente inteligente como para crear solo tantos subprocesos como núcleos, poniendo en cola las operaciones restantes. Con NSThread , crear 100 subprocesos para almacenar en caché 100 imágenes probablemente sea excesivo y algo ineficiente.
  • Es posible que desee cancelar la operación cacheImage . Implementar la cancelación es más fácil con NSOperationQueue ; La mayoría del trabajo ya está hecho para ti.
  • NSOperationQueue es libre de cambiar a una implementación más inteligente (como Grand Central Dispatch) ahora o en el futuro. Es más probable que NSThread sea ​​siempre un hilo del sistema operativo.

Prima:

  • NSOperationQueue tiene algunas otras construcciones agradables integradas, como una forma sofisticada de respetar las prioridades y dependencias de la operación.

Actualmente estoy usando NSThread para almacenar imágenes en caché en otro hilo.

[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image];

Alternativamente:

[self performSelectorInBackground:@selector(cacheImage:) withObject:image];

Alternativamente, puedo usar un NSOperationQueue

NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image]; NSOperationQueue *opQueue = [[NSOperationQueue alloc] init]; [opQueue addOperation:invOperation];

¿Hay alguna razón para cambiar de NSThread ? GCD es una cuarta opción cuando se lanza para el iPhone, pero a menos que haya un aumento significativo del rendimiento, prefiero seguir con los métodos que funcionan en la mayoría de las plataformas.

Basado en el consejo de @Jon-Eric, NSOperationQueue una solución de subclase NSOperationQueue / NSOperation . Funciona muy bien. La clase NSOperation es lo suficientemente flexible como para que pueda usarla con invocaciones, bloques o subclases personalizadas, según sus necesidades. No importa cómo cree su NSOperation , puede lanzarlo a la cola de operaciones cuando esté listo para ejecutarlo. Las operaciones están diseñadas para funcionar como objetos que se ponen en cola o pueden ejecutarse como métodos asíncronos independientes, si lo desea. Ya que puede ejecutar fácilmente sus métodos de operación personalizados de manera sincrónica, las pruebas son trivialmente fáciles.

He utilizado esta misma técnica en varios proyectos desde que hice esta pregunta y no podría estar más feliz con la forma en que mantiene mi código y mis pruebas limpias, organizadas y felizmente asíncronas.

A ++++++++++ subclase de nuevo


Yo usaría NSOperationQueue . Bajo OS 3.2, NSOperationQueue usa hilos debajo del capó, por lo que los dos métodos deberían funcionar de manera similar. Sin embargo, bajo Mac OS 10.6, NSOperationQueue usa GCD bajo el capó y, por lo tanto, tiene la ventaja de no tener la sobrecarga de subprocesos separados. No he mirado los documentos para OS 4, pero sospecho que hace algo similar; en cualquier caso, NSOperationQueue podría intercambiar implementaciones cuando las ventajas de rendimiento de GCD estén disponibles para el iPhone.