Я хочу обернуть асинхронный API, который выглядит следующим образом:
[someObject completeTaskWithCompletionHandler:^(NSString *result) {
}];
в синхронный метод, который я могу назвать следующим образом
NSString *result = [someObject completeTaskSynchronously];
Как мне это сделать? Я сделал некоторое чтение документа и поиск в Google и попытался использовать "dispatch_semaphore", чтобы попытаться добиться его так:
-(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;
}
Но это, похоже, не работает, оно в основном останавливается на dispatch_semaphore_wait. Выполнение никогда не достигает внутреннего блока, который выполняет _signal. У кого-нибудь есть пример кода о том, как это сделать? Я подозреваю, что блок должен быть на другом потоке другого основного потока? Кроме того, предположим, что у меня нет доступа к исходному коду за методом async. Спасибо!