Я много искал, чтобы узнать, как другие решили эту проблему, но, к сожалению, я не нашел ответа на этот конкретный вопрос. Я бы очень признателен вам за вашу помощь.Как заставить один метод ждать другого (асинхронного) метода до завершения выполнения?
Реферат: У меня есть два метода в моем классе, method1 и method2. Мне нужно вызвать функцию async внутри метода1. Затем код продолжает выполнение и достигает метода2. Но в методе 2 есть случаи, когда мне нужно использовать результат этого асинхронного вызова в методе 1, поэтому мне нужно убедиться, что асинхронный вызов в методе 1 завершил работу перед остальной частью метода2.
Я знаю, что одним из способов является использование семафоров, а другим способом является использование блоков завершения. Но я хочу сделать это наиболее общим образом, потому что будут другие методы, похожие на method2, которые снова должны будут дождаться завершения асинхронного вызова метода method1 до продолжения выполнения. По той же причине я не могу просто вызвать функцию async внутри самого метода2 и поместить оставшуюся часть метода в блок завершения.
Вот приблизительное представление о том, что я пытаюсь сделать. Я был бы признателен, если кто-то добавит завершение блоков в этот псевдокод, чтобы я мог видеть четкую картину того, как все будет работать. BTW, method1 и method2 (и все другие методы в этом классе) находятся в одном потоке (но не в основном потоке).
@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
Обновление: Я знаю, что может сигнализировать семафор после того, как вызов асинхронной завершается, и я могу ждать того же семафора в method2, но я хочу использовать блок завершения вместо потому что я думаю, что было бы более общий характер, особенно если в этом классе есть другие методы, подобные методу2. Может ли кто-нибудь добавить к этому блоку блокировку, поскольку у меня возникают проблемы с этой работой?
Вашей 'логика for' петля заставляет меня думать, что это может быть то, что вы ищете: «* Использование групп отправки - группировка блоков позволяет выполнять агрегатную синхронизацию. Ваше приложение может отправлять несколько блоков и отслеживать, когда они все завершатся, даже если они могут выполняться в разных очередях. Такое поведение может быть полезно, когда прогресс не может быть сделано до тех пор, пока все указанные задачи не будут завершены. * « –
Спасибо, но у меня есть только один блок, который нужно заполнить, и несколько мест, где его результат должен использоваться. Можете ли вы добавить к указанному выше псевдокоду, как группы отправки будут работать в этом случае? – makingCodeWork
Ваш асинхронный вызов находится внутри цикла. Вы имеете в виду, что «условие С» верно только для одного элемента? –