Я использую GCD на iOS для выполнения трудоемкой задачи в фоновом потоке. В API есть метод запуска, который принимает в качестве аргументов два блока, оба вызываются в основной очереди. Первый вызывается при запуске задачи, а второй — при завершении задачи. Это все работает.
На самом деле мне нужно выполнить несколько таких трудоемких задач. API позволяет мне запускать их все одновременно, а затем ждать завершения каждого из них и обновлять пользовательский интерфейс через блоки. Они работают одновременно.
Однако на самом деле я хочу упорядочить трудоемкие задачи (по-прежнему запуская каждую с использованием описанного API), чтобы я мог запускать их все одновременно, запускать первую и давать мне ее обратные вызовы, затем запустите второй и дайте мне его обратные вызовы и т. д., пока все не будет сделано.
Каков наилучший способ добиться этого с помощью GCD и блоков?
Если бы задачи были синхронными, у меня был бы просто цикл, который запускал бы каждую по очереди, и запускал бы все это асинхронно. Но у меня есть обратные вызовы, так что это не сработает. Я бы предпочел не связывать их в цепочку, поскольку объект, из-за которого все это происходит, может исчезнуть, как только он запустит последовательность событий.