2012-06-22 9 views

Respuesta

21

Grand Central Dispatch tiene dispatch_after() que ejecutará un bloque después de un tiempo especificado en una cola especificada. Si crea una cola de fondo, tendrá la funcionalidad que desee.

dispatch_queue_t myBackgroundQ = dispatch_queue_create("com.romanHouse.backgroundDelay", NULL); 
// Could also get a global queue; in this case, don't release it below. 
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC); 
dispatch_after(delay, myBackgroundQ, ^(void){ 
    [self delayedMethodWithObject:someObject]; 
}); 
dispatch_release(myBackgroundQ); 
4
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)] 

Realiza un selector en la secuencia a la que se está llamando. Entonces, cuando lo llames desde un hilo de fondo, se ejecutará allí ...

+0

el problema es que cuando '[libre performSelector: (SEL) withObject: (id) afterDelay: (NSTimeInterval)]' se usa solo en un subproceso de fondo, no se está ejecutando –

2

Usted puede hacer eso por ejemplo:

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, <delay in seconds> * NSEC_PER_SEC); 
dispatch_after(delay, dispatch_get_main_queue(), ^{ 
    [self performSelectorInBackground: <sel> withObject: <obj>] 
}); 

alguna manera una solución mixta. Sería mejor seguir con un enfoque GCD completo aunque.

7

Pruebe lo siguiente:

// Run in the background, on the default priority queue 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)] 
}); 

Código no probado

Tenga en cuenta que el selector/método no debe utilizar las propiedades UIKit (así que no actualizar la interfaz de usuario) o el acceso UIKit (como marco) por lo tanto, es posible que su selector deba iniciar el trabajo de regreso al hilo principal. p.ej.

(id)SomeMethod:UsingParams: { 

    // Do some work but the results 

    // Run in the background, on the main queue 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Do something UIKit related 
    }); 
} 
+3

1 para mencionar que la interfaz de usuario no debe tocarse desde un hilo de fondo. – Barjavel

Cuestiones relacionadas