Поместите несколько асинхронных вызовов в очередь

У меня есть несколько асинхронных вызовов, которые я бы объединил в один вызов:

-(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:

  1. Добавить все звонки в очередь
  2. Подождите, пока все вызовы не будут завершены (был вызван либо блок успешно, либо неудачно)
  3. Объедините все результаты из блоков завершения и вызовите блок завершения loadAll метод.

Я знаю, что это возможно в GCD с синхронными вызовами, но я не вижу, как этого добиться с моими тремя асинхронными "дочерними вызовами".

1 ответ

Решение

Читайте о группах рассылки - вы можете сделать синхронное ожидание их. И действительно, грязное - это неправильное слово - немного сложнее, может быть, это лучше сказать. Мне очень повезло с вложенными блоками отправки и использованием групп для ожидания промежуточных результатов. Вы также можете использовать dispatch_async_barrier, чтобы блоки, уже находящиеся в очереди, не завершили работу до того, как этот блок будет выполнен. Блоки также могут добавлять блоки в свою очередь отправки!

Я помню, что были зависимости, но я не могу найти этот раздел в литературе CGD.

То, что я действительно предлагаю вам сделать, это набросать это карандашом на листе бумаги, и как только вы убедите себя, вы узнаете, как это сработает, начнете кодировать.

Другие вопросы по тегам