2011-12-05 20 views
8

A primera vista me pareció una pregunta fácil, pero no puedo entender cómo ejecutar un bloque anónimo en un determinado hilo de fondo, es decir, estoy buscando los bloques equivalentes de -performSelector:onThread:withObject:waitUntilDone: .Ejecutar un bloque anónimo en un hilo de fondo específico

Relacionado: ¿Es posible asociar una cola de envío con un determinado hilo de fondo, al igual que la cola principal está asociada con el hilo principal de la aplicación?

Edición Aclaro que estoy buscando para ejecutar un bloque anónimo

Respuesta

6

vi esta función RunOnThread() recientemente en PLBlocksPlayground de Mike Ash (archivo zip, ver BlocksAdditions.m):

void RunOnThread(NSThread *thread, BOOL wait, BasicBlock block) 
{ 
    [[[block copy] autorelease] performSelector: @selector(my_callBlock) onThread: thread withObject: nil waitUntilDone: wait]; 
} 

Esto es lo que estaba buscando.

Hay un montón de otras utilidades relacionadas con bloques muy útiles en PLBlocksPlayground, la mayoría de las cuales el Sr. Ash explica en este post.

+0

El enlace parece estar roto, ¿alguien sabe dónde está el contenido? – nmr

+0

No tengo idea de dónde está el contenido ahora. Sin embargo, le he preguntado a Mike Ash (el autor de PLBlocksPlayground) sobre esto; con suerte sabremos su nueva ubicación pronto. –

+1

He actualizado el enlace, ahora apunta a un archivo zip que puede descargar. –

-1

Un bloque es una función. Llámalo como llamarías a cualquier otra función.

+0

Debo mencionar que estaba buscando ejecutar un bloque anónimo en un hilo de fondo. –

7

Si le entiendo derecho que debe hacer esto:

dispatch_queue_t thread = dispatch_queue_create("your dispatch name", NULL); 
dispatch_async(analyze, ^{ 
    //code of your anonymous block 
}); 
dispatch_release(thread); 

También puede escribir algún método, que se llevará a bloque a la misma, pero debe saber qué tipo de parámetros que se tiene:

-(void)performBlock:(void (^)(SomeType par1, SomeType par2))block ToData:(Sometype)data; 

se le puede llamar con el bloque anónimo:

[something performBlock:^(SomeType par1, SomeType par2){ 
    //do your stuff 
} ToData: data] 

Y en el método puede llamar a su bl ock como una función simple en C:

block(par1, par2); 
+3

No creo que GCD proporcione ninguna garantía con respecto a qué hilo se ejecuta una cola de distribución; así que no creo que su primera solución funcione. Tu segunda solución es más interesante; Creo que debería funcionar - será probarlo y actualizar. –

+0

@ChaitanyaGupta es correcto. Un dispatch_queue no es lo mismo que un hilo. Un dispatch_queue puede ejecutarse en cualquier cantidad de subprocesos. – bandejapaisa

Cuestiones relacionadas