2011-12-08 11 views
22

È possibile eseguire un blocco di completamento sul thread principale?Come posso recuperare un valore di ritorno da un blocco di completamento?

Ad esempio, ho un metodo che restituisce un valore:

- (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 */ 
     } 
     ]; 
} 

ma non posso vedere come restituire il valore intero dall'interno del blocco completamento come il risultato di questo metodo, poiché il completamento il blocco viene eseguito su un thread in background.

Come posso fare questo?

+0

Quindi ... non usare un blocco che crea un nuovo thread. È un blocco di framework o di libreria che non puoi modificare? – JoePasq

risposta

29

Ti mancano alcune nozioni di base sullo sviluppo asincrono con i blocchi. Non è possibile avere un blocco inviato restituito da qualsiasi luogo ma dal proprio ambito. Pensa a ciascun blocco come a un metodo, anziché a un codice inline.

Penso che quello che stai cercando è qualcosa di simile a questo ...

- (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); 
    }]; 
} 
Problemi correlati