У меня есть метод в приложении iOS, который должен вернуть значение bool в зависимости от того, удастся ли веб-вызов или нет.iOS Выполнение стоп-кадра от прогрессирования до завершения блока
Веб-вызов структурирован таким образом, что он принимает блок как параметр обратного вызова и этот обратный вызов вызывается, когда веб-вызов имеет результат. Исходя из этого результата, мой метод должен вернуть значение True/False.
Итак, мне нужно остановить выполнение от дальнейшего прогресса, не получив результата.
Я пытаюсь достичь этого через семафоры, посмотрев на некоторые примеры, которые другие поделили, но обратный вызов никогда не вызывается, если я удалю семафор, тогда обратный вызов всегда вызывается.
Что мне здесь не хватает?
+ (BOOL)getUserInformation {
__block BOOL flag = false;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[[WebServicesManager sharedManager] getUserInformationWithCallback:^(NSInteger statusCode, NSString *response, NSDictionary *responseHeaders, id obj, NSError *error) {
if (error) {
//Handle error case and perform appropriate cleanup actions.
}
else
{
//Save user information
flag = true;
}
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return flag;
}
я ставлю точку останова на if(error)
, чтобы проверить, если обратный вызов вызывается, он не делает, если я не удалить семафор.
Я мог бы дать этому методу свой собственный блок обратного вызова, или я мог бы дать содержащему классу делегата и добиться того, что мне нужно, но я бы очень хотел, чтобы этот подход работал.
Просто Hinch: это неопределенные 'WebServicesManager' dispatc hing это обратный вызов к основному потоку, который ждет семафора? – SmokeDispenser
Хммм, это имеет смысл, я проверю. –
Ян прав. Но, для протокола, это очень, очень плохая практика. Вы собираетесь заблокировать поток, которого вы никогда не должны делать (если вам не повезло в вашем сроке, это может привести к тому, что процесс сторожевого копирования приведет к удалению вашего приложения, это ужасный UX и т. Д.). Вы должны реорганизовать свой код, который вызывает это, чтобы принять асинхронные шаблоны. Если вам нужна помощь в этом, отредактируйте свой вопрос и покажите нам, как вы называете 'getUserInformation', и как поток продолжается, и мы можем предложить дальнейшие советы. – Rob