Несколько GCD-рассылок в главном потоке - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь ускорить загрузку моего приложения, и одна из идей, которые у меня были для этого, заключалась в использовании асинхронных очередей отправки. У меня есть 2 задачи, которые можно запускать рядом друг с другом при запуске (на самом деле довольно большие задачи). Тем не менее, оба они имеют значительную часть, которая работает в основном потоке (в основном код пользовательского интерфейса).

dispatch_async(dispatch_get_main_queue, ^{
    [self doTask1];
});

dispatch_async(dispatch_get_main_queue, ^{
    [self doTask2];
    //Will task 2 take turns with task 1, or will task 2 start after 1 is finished?
});

У меня такой вопрос: если я вызову 2 dispatch_async при загрузке, как в этом примере, будут ли они выполняться по очереди или сначала будет выполнен весь первый блок, а затем 2-й блок?

Ответы [ 2 ]

6 голосов
/ 05 марта 2012

основная очередь является последовательной очередью.блоки, добавленные в последовательные очереди, выполняются в порядке их добавления и только по одному за раз (последовательно).в вашем примере задача 2 не запустится, пока задача 1 не будет завершена.

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

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(q, ^{/* this work may finish before other work added to this queue later */});
0 голосов
/ 05 марта 2012

Один будет выполняться после другого, но они будут выполняться одновременно, а это значит, что вы можете выполнить задачу 2 до завершения задачи 1.

Проверьте альтернативу:

dispatch_async(dispatch_get_main_queue, ^{
    [self doTask1];
    dispatch_async(dispatch_get_main_queue, ^{
        [self doTask2];
        //Now task2 will execute after task1
    });
});
...