2009-05-28 13 views

Respuesta

20

Harías

[self performSelectorInBackground:@selector(heavyStuff) withObject:nil]; 

Véase el NSObject reference en el sitio de Apple.

4

Usted podría utilizar NSOperationQueue y NSInvocationOperation:

[self myFoo]; 

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                 selector:@selector(heavyStuff) object:nil]; 
[operationQueue addOperation:operation]; 

[self myBar]; 
15

Por "dispara y olvida", trate [self performSelectorInBackground:@selector(heavyStuff) withObject:nil]. Si tiene más de una operación como esta, puede consultar NSOperation y su subclase NSInvocationOperation. NSOperationQueue gestionado conjunto de hilos, número de operaciones que se ejecutan simultáneamente e incluye notificaciones o bloquear métodos para dirá cuando todas las operaciones completa:

[self myFoo]; 

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                                 selector:@selector(heavyStuff) object:nil]; 

[operationQueue addOperation:operation]; 
[operation release]; 

[self myBar]; 

... 

[operationQueue waitUntilAllOperationsAreFinished]; //if you need to block until operations are finished 

En un nivel inferior, puede utilizar el uso -[NSThread detachNewThreadSelector:@selector(heavyStuff) toTarget:self withObject:nil].

+0

falta una 'g' en performSelectorInBackround – Erich

+0

fijo. gracias @Erich. –

7

Aquí tienes muchos consejos geniales, pero no te olvides de pasar algo de tiempo con el Threading Programming Guide. Proporciona una buena guía no solo sobre las tecnologías, sino también sobre un buen diseño de procesamiento concurrente y sobre cómo hacer un mejor uso del ciclo de ejecución tanto con hilos como en lugar de hilos.

7

Si usted está apuntando Snow Leopard exclusivamente, puede utilizar Grand Central Dispatch:

[self myFoo]; 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [self heavyStuff]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self myBar]; 
    }); 
}); 

pero no va a funcionar con los sistemas anteriores (o el iPhone) y es algo excesivo.

EDIT: funciona en iPhone desde iOS 4.x.

+0

NSOperation también usa GCD en Snow Leopard e incluye una subclase NSBlockOperation para que pueda usar bloques con ella. – Chuck

Cuestiones relacionadas