Я много искал, чтобы узнать, как другие решили эту проблему, но, к сожалению, я не нашел ответа на этот конкретный вопрос. Я был бы очень признателен за вашу помощь.
Вот резюме: у меня есть два метода в моем классе, метод1 и метод2. Мне нужно вызвать асинхронную функцию внутри метода1. Затем код продолжает выполняться и достигает метода2. Но в методе 2 есть случаи, когда мне нужно использовать результат этого асинхронного вызова в методе 1, поэтому мне нужно убедиться, что асинхронный вызов в методе 1 завершился, прежде чем переходить к остальной части метода 2.
Я знаю, что один способ — использовать семафоры, а другой — использовать блоки завершения. Но я хочу сделать это наиболее общим способом, потому что будут другие методы, похожие на метод2, которым снова нужно будет дождаться завершения асинхронного вызова в методе1, прежде чем продолжить выполнение. Также по той же причине я не могу просто вызвать асинхронную функцию внутри самого метода2 и поместить остальную часть метода2 в его блок завершения.
Вот примерное представление о том, что я пытаюсь сделать. Я был бы признателен, если бы кто-нибудь добавил в этот псевдокод блоки завершения, чтобы я мог ясно видеть, как все будет работать. Кстати, метод1 и метод2 (и все остальные методы в этом классе) находятся в одном потоке (но не в основном потоке).
@implementation someClass
-(void)method1 {
for (each item in the ivar array) {
if (condition C is met on that item) {
some_independent_async_call(item, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(int result, int *someArray) {
if (result > 0) {
// The async call worked correctly, we will need someArray
}
else {
// We didn't get someArray that we wanted.
}
});
}
}
}
-(void)method2 {
// Select one item in the ivar array based on some criteria.
if (condition C is met on that item) {
// Wait for some_independent_async_call() in method1 to complete.
// Then use someArray in the rest of the code.
}
else {
// Simply continue the rest of the code.
}
}
@end
Обновление: я знаю, что могу подать сигнал семафору после завершения асинхронного вызова, и я могу дождаться того же семафора в методе2, но вместо этого я хочу использовать блок завершения, потому что я думаю, что это было бы более общим, особенно если есть другие методы, похожие на метод2 в этом классе. Может кто-нибудь добавить блоки завершения в этот код, так как у меня возникают проблемы с его работой?
for
наводит меня на мысль, что это может быть то, что вы ищете: Использование групп рассылки — блоки группировки позволяют осуществлять агрегированную синхронизацию. Ваше приложение может отправлять несколько блоков и отслеживать их завершение, даже если они могут выполняться в разных очередях. Такое поведение может быть полезно, когда прогресс невозможен, пока не будут выполнены все указанные задачи. - person Phillip Mills   schedule 03.05.2016