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. ConNSThread
, 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 conNSOperationQueue
; 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 queNSThread
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.