iphone ios corriendo en hilo separado

96

¿Cuál es la mejor manera de ejecutar código en un hilo separado? Lo es:

[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];

He estado haciendo la segunda forma, pero el libro de cocina de Wesley que he estado leyendo usa la primera.

Mike S
fuente

Respuestas:

243

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 algo de procesamiento en un hilo en segundo plano y luego hacer algo con los resultados en el ciclo de ejecución principal es increíblemente 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 aún no lo ha hecho, vea los videos de WWDC 2010 en libdispatch / GCD / blocks.

Jacques
fuente
Necesito que sea compatible con 3.0 :(
Mike S
1
Entonces, las colas de operaciones son probablemente la siguiente mejor solución. Además, asegúrese de no sumergirse en la concurrencia demasiado rápido. Intente comenzar escribiendo cosas de un solo subproceso y perfil para ver si necesita pasar a un subproceso múltiple, o si puede diseñar su código de un solo subproceso para que sea más eficiente por sí solo. 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 multiproceso.
Jacques
Perdón por resucitar esto mucho más tarde, pero si genero una llamada de método con performSelector: withObject: afterDelay, ¿todavía necesito usar un NSAutoReleasePool dentro del método async? Si utiliza mágicamente el grupo principal de liberación automática, entonces performSElector: afterDelay es definitivamente una opción más rápida.
Mike S
No, porque el método se está ejecutando en el hilo principal, que tiene su propio grupo de liberación automática.
Jacques
4
@Joe A riesgo de decir algo que ya sabes, no debes acostumbrarte a escribir código que mata hilos, no te ayudará ni a ti ni a tu carrera a largo plazo. Vea esta publicación (o muchas similares) para conocer las razones por las que no debe eliminar los hilos.
MikeC
1

La mejor forma de multiproceso en iOS es utilizando 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
    });
});
Kusal Shrestha
fuente
0

Probaría todas las técnicas que la gente ha publicado y vería cuál es la más rápida, pero creo que esta es la mejor manera de hacerlo.

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];
Poli
fuente
esto lanza el hilo en una prioridad baja. Usar gcd es la mejor forma de enhebrar.
Karsten