2011-12-08 5 views
22

¿Es posible ejecutar un bloque de finalización en el hilo principal?¿Cómo puedo recuperar un valor de retorno de un bloque de finalización?

Por ejemplo, tengo un método que devuelve un valor:

- (int)test 
{ 

    /* here one method is called with completion block with return type void */ 

    [obj somemethodwithcompeltionblock: 
     { 
     /* here I am getting my Int which I want to return */ 
     } 
     ]; 
} 

pero no puedo ver cómo devolver el valor entero desde dentro del bloque de terminación como resultado de este método, debido a la finalización el bloque se ejecuta en un hilo de fondo.

¿Cómo puedo hacer esto?

+0

Así que ... no utilizan un bloque que crea un nuevo hilo. ¿Es esto un marco o bloque de biblioteca que no puedes modificar? – JoePasq

Respuesta

29

Faltan algunos conceptos básicos sobre el desarrollo asincrónico con bloques. No puede tener un retorno de bloque enviado desde cualquier lugar, excepto su propio alcance. Piense en cada bloque como su propio método, en lugar de código en línea.

Creo que lo que está buscando es algo similar a esto ...

- (void)testWithHandler:(void(^)(int result))handler 
{ 
    [obj somemethodwithcompeltionblock:^{ 
      int someInt = 10; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       handler(10); 
      }); 
     } 
     ]; 
} 


- (void)callSite 
{ 
    [self testWithHandler:^(int testResult){ 
     NSLog(@"Result was %d", testResult); 
    }]; 
} 
Cuestiones relacionadas