1

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

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-й блок?

ответ

6

основной очереди последовательной очереди. блоки, добавленные в последовательные очереди, выполняются в том порядке, в котором они добавлены, и только по одному (поочередно). в вашем примере задача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

Если это очередная очередь, то почему я могу назвать асинхронные отправки? –

+1

Я не понимаю ваш вопрос, почему бы вам не удастся? async просто означает, что вы хотите вставить ячейку в блок, но не обязательно нужен результат прямо сейчас или хотите, чтобы он заблокировал текущую операцию, в которой вы ее выставили. он не требует, чтобы это происходило в другом потоке или начиналось немедленно. –

+3

Кажется, существует распространенное заблуждение, что «асинхронные» и «параллельные» являются синонимами. Я не уверен, откуда она взялась, но я вижу, что это переполнение стека. –

-2

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

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

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

Таким образом, альтернатива гарантирует, что они будут выполняться в этом порядке, и мой пример может позволить task2 завершить перед task1? Примечание. Я ищу последнее поведение. –

+0

Да, моя альтернатива гарантирует, что одна задача начинается после другой. – fbernardo

+3

Основная очередь не выполняет задачи одновременно –

Смежные вопросы