Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I retrieve a return value from a completion block?

Tags:

Is it possible to run a completion block on the main thread?

For example, I have one method which returns a value:

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

but I can't see how to return the integer value from within the completion block as the result of this method, because the completion block runs on a background thread.

How can I do this?

like image 288
Elegant Microweb Avatar asked Dec 08 '11 14:12

Elegant Microweb


1 Answers

You're missing some basics about asynchronous development with blocks. You can't have a dispatched block return from anywhere but its own scope. Think of each block as its own method, instead of inline code.

I think what you're looking for is something similar to this...

- (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);     }]; } 
like image 172
Joshua Weinberg Avatar answered Sep 25 '22 11:09

Joshua Weinberg