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

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

-(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 с синхронными вызовами, но я не вижу, как добиться этого с моими тремя асинхронными «дочерними вызовами».


person Besi    schedule 31.07.2012    source источник


Ответы (1)


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

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

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

person David H    schedule 31.07.2012