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

14,893

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);
    }];
}
Share:
14,893

Related videos on Youtube

Elegant Microweb
Author by

Elegant Microweb

Updated on June 07, 2020

Comments

  • Elegant Microweb
    Elegant Microweb almost 4 years

    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?

    • fearmint
      fearmint over 12 years
      So... don't use a block that creates a new thread. Is this a framework or library block that you can't modify?