2010-06-15 23 views
29

Actualmente estoy usando NSThread para almacenar imágenes en otro hilo.NSThread vs. NSOperationQueue vs. ??? en el iPhone

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

alternativa:

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

Alternativamente, puedo utilizar 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 lejos de NSThread? GCD es una cuarta opción cuando se lanza para el iPhone, pero a menos que haya una ganancia de rendimiento significativa, prefiero seguir con los métodos que funcionan en la mayoría de las plataformas.


@ Sobre la base de los consejos de Jon-Eric, fui con una solución subclase NSOperationQueue/NSOperation. Funciona muy bien. La clase NSOperation es lo suficientemente flexible como para poder utilizarla con invocaciones, bloques o subclases personalizadas, según sus necesidades. No importa cómo cree su NSOperation, puede simplemente ponerlo en una cola de operaciones cuando esté listo para ejecutarlo. Las operaciones están diseñadas para funcionar como objetos que coloca en una cola o puede ejecutarlos como métodos asíncronos independientes, si lo desea. Dado que puede ejecutar fácilmente sus métodos de operación personalizados sincrónicamente, la prueba es trivialmente fácil.

He utilizado esta misma técnica en un puñado de 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 ++++++++++ ¿Sería subclase de nuevo

+0

Podría ubicar cada una de ellas. Esa sería una forma de averiguarlo. –

+0

El rendimiento fue la palabra incorrecta, sospecho que son todos iguales por debajo. Estoy más buscando a alguien que tenga experiencia con dos o más de estos métodos para darme algunos consejos sobre la forma preferida y por qué es mejor. – kubi

Respuesta

32

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 es probablemente excesivo y algo ineficaz.
  • 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. NSThread es más probable que siempre sea solo un hilo del sistema operativo.

Bono:

  • NSOperationQueue ha incorporado en algunas otras construcciones agradables, como una forma sofisticada de honrar a las prioridades de operación y dependencias.
+0

Suponiendo que no necesita los extras que proporciona NSOperationQueue, ¿por qué la creación de 100 NSThreads es ineficaz? ¿O está asumiendo que si se deben crear 100 hilos, debe haber una necesidad de algunos objetos NSOperationQueue? – Tony

+4

@Tony: Crear un hilo es muy costoso. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html – kubi

5

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

Cuestiones relacionadas