Поместите несколько асинхронных вызовов в очередь
У меня есть несколько асинхронных вызовов, которые я бы объединил в один вызов:
-(void) loadA:(ArrayBlock)completion failure(FailureBlock):failure;
-(void) loadB:(ArrayBlock)completion failure(FailureBlock):failure;
-(void) loadC:(ArrayBlock)completion failure(FailureBlock):failure;
Комбинированный метод, который использует вызовы выше:
- (void) loadAll:(ObjectBlock)completion;
Блок завершения содержит объект с тремя массивами array[A-C]
, Если какой-либо из дочерних вызовов терпит неудачу, соответствующий массив в объекте просто устанавливается в ноль.
Вместо того, чтобы вкладывать эти три блока и вызывать следующий в случае сбоя или завершения предыдущего (это становится очень грязным) - я хочу сделать что-то вроде следующего, используя GCD:
- Добавить все звонки в очередь
- Подождите, пока все вызовы не будут завершены (был вызван либо блок успешно, либо неудачно)
- Объедините все результаты из блоков завершения и вызовите блок завершения
loadAll
метод.
Я знаю, что это возможно в GCD с синхронными вызовами, но я не вижу, как этого добиться с моими тремя асинхронными "дочерними вызовами".
1 ответ
Читайте о группах рассылки - вы можете сделать синхронное ожидание их. И действительно, грязное - это неправильное слово - немного сложнее, может быть, это лучше сказать. Мне очень повезло с вложенными блоками отправки и использованием групп для ожидания промежуточных результатов. Вы также можете использовать dispatch_async_barrier, чтобы блоки, уже находящиеся в очереди, не завершили работу до того, как этот блок будет выполнен. Блоки также могут добавлять блоки в свою очередь отправки!
Я помню, что были зависимости, но я не могу найти этот раздел в литературе CGD.
То, что я действительно предлагаю вам сделать, это набросать это карандашом на листе бумаги, и как только вы убедите себя, вы узнаете, как это сработает, начнете кодировать.