2010-10-06 20 views
91

¿Cuál es la mejor manera de ejecutar código en un hilo separado? Es:iphone ios ejecutándose en un hilo separado

[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL]; 

O:

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

que he estado haciendo el segundo camino, pero el libro de cocina Wesley He estado leyendo utiliza el primero.

Respuesta

237

En mi opinión, la mejor manera es con libdispatch, también conocido como Grand Central Dispatch (GCD). Te limita a iOS 4 y superior, pero es tan simple y fácil de usar. El código para hacer algún tipo de procesamiento en un subproceso de fondo y luego hacer algo con los resultados en el bucle principal de ejecución es muy fácil y compacto:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // Add code here to do background processing 
    // 
    // 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Add code here to update the UI/send notifications based on the 
     // results of the background processing 
    }); 
}); 

Si no lo ha hecho ya, echa un vistazo a los vídeos de la WWDC 2010 en libdispatch/GCD/bloques.

+0

necesito que sea compatible con 3.0 :( –

+1

Entonces colas de operación son, probablemente, el siguiente mejor solución. Además, asegúrese de que usted no es el buceo en concurrencia con demasiada rapidez. Trate de comenzar escribiendo cosas de un solo Enhebrado y perfil para ver si necesita ir multiproceso, o si puede diseñar su código de subproceso único para ser más eficiente por sí mismo. Para tareas simples, a veces puede hacer todo lo que necesita con performSelector: withObject: afterDelay: y evitar todos los problemas que vienen con la programación de subprocesos múltiples – Jacques

+0

Perdón por resucitar esto mucho más tarde, pero si genero una llamada a un método con performSelector: withObject: afterDelay ¿todavía necesito usar un NSAutoReleasePool dentro del método async? Si t usa mágicamente el grupo principal de versiones automáticas luego el performSElector: afterDelay es definitivamente una opción más rápida. –

1

La mejor manera para el multihilo en iOS es usar GCD (Grand Central Dispatch).

//creates a queue. 

dispatch_queue_t myQueue = dispatch_queue_create("unique_queue_name", NULL); 

dispatch_async(myQueue, ^{ 
    //stuffs to do in background thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    //stuffs to do in foreground thread, mostly UI updates 
    }); 
}); 
+3

¿No leyó las otras respuestas? –

0

me gustaría probar todas las técnicas de las personas han publicado y ver cuál es el más rápido, pero creo que esta es la mejor manera de hacerlo.

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil]; 
Cuestiones relacionadas