Search code examples
iphoneioscocoa-touchios4objective-c-blocks

Make iOS blocks execute synchronously


How can I make a block execute synchronously, or make the function wait for the handler before the return statement, so the data can be passed back from the block?

-(id)performRequest:(id)args
{
__block NSData *data = nil;   

    [xyzclass requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
        data = [NSData dataWithData:responseData];
    }];

    return data;
}

Solution

  • You can use semaphores in this case.

    -(id)performRequest:(id)args
    {
        __block NSData *data = nil;   
         dispatch_semaphore_t sem = dispatch_semaphore_create(0);
         [xyzclass requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
           data = [NSData dataWithData:responseData];
           dispatch_semaphore_signal(sem);
         }];
        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
        return data;
    }
    

    semaphore will block execution of further statements until signal is received, this will make sure that your function does not return prematurely.