How to wrap an asynchronous method that takes a block and turn it synchronous in Objective-C

Viewed 4811

I want to wrap an async API that look like this:

[someObject completeTaskWithCompletionHandler:^(NSString *result) {

}];

into a synchronous method that I can call like this:

NSString *result = [someObject completeTaskSynchronously];

How do I do this? I did some doc reading and internet search, and attempt to use "dispatch_semaphore" to do try to achieve it like so:

-(NSString *) completeTaskSynchronously {
   __block NSString *returnResult;
   self.semaphore = dispatch_semaphore_create(0);  
   [self completeTaskWithCompletionHandler:^(NSString *result) {
       resultResult = result;
       dispatch_semaphore_signal(self.semaphore);
   }];

   dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
   return resultResult;
}

But this doesn't seem to work, it basically just halt at dispatch_semaphore_wait. Execution never reaches inside block that do the _signal. Anyone has code example on how to do this? I suspect that the block has to be on a different thread other the main thread? Also, assume I don't have access to the source code behind the async method.

4 Answers
Related