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;
}
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.