Как я могу чередовать асинхронные фоновые задачи с GCD? - PullRequest
2 голосов
/ 26 августа 2011

Я использую GCD на iOS для выполнения трудоемкой задачи в фоновом потоке. В API есть метод start, который принимает два блока в качестве аргументов, оба из которых вызываются в главной очереди. Первый вызывается при запуске задачи, а второй - при завершении задачи. Это все работает.

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

Однако, что я на самом деле хочу сделать, так это упорядочить трудоемкие задачи (по-прежнему запуская каждую с использованием описанного API), чтобы я мог запустить их все одновременно, запустить первый и вызвать его -бэки, затем запустите второй и дайте мне его обратные вызовы и т. д., пока все не будет сделано.

Как лучше всего добиться этого с помощью GCD и блоков?

Если бы задачи были синхронными, я бы просто запустил цикл, который выполнялся каждый по очереди, и выполнял бы все это асинхронно. Но у меня есть обратные вызовы, так что это не сработает. Я бы предпочел не связывать их, так как объект, который все это делает, может исчезнуть, как только он начнет последовательность событий.

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Вы можете создать свою собственную последовательную очередь, которая будет выполняться в порядке FIFO с помощью dispatch_queue_create.Вам НЕ нужно указывать, что это последовательная очередь.Это будет действовать по умолчанию.

Пример создания очереди:

dispatch_queue_t my_q = dispatch_queue_create("Serial",NULL);

Вы являетесь владельцем этой очереди, поэтому, если она не будет освобождена (с помощью dispatch_release), произойдет утечка.

Больше информации в Документы Apple здесь .

0 голосов
/ 26 августа 2011

Есть ли особая причина, по которой вы должны использовать GCD?Похоже, NSOperationQueue с параллелизмом 1 именно то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...