Таким образом, две очереди станут двумя потоками.
Не обязательно. Одним из преимуществ GCD является то, что система динамически решает, сколько потоков она создает, в зависимости от количества доступных ядер ЦП и других факторов. Вполне возможно, что две пользовательских очереди выполняются в одном фоновом потоке, особенно если для обеих очередей редко ожидают выполнения задачи.
Единственное, в чем вы можете быть уверены, это то, что последовательная очередь никогда не использует более одного потока одновременно. Таким образом, задачи, которые вы добавляете в одну (последовательную) очередь, всегда будут выполняться по порядку. Это не относится к трем параллельным глобальным очередям, которые вы получаете с dispatch_get_global_queue()
.
Кроме того, основная очередь (та, к которой вы обращаетесь с помощью dispatch_get_main_queue()
) всегда связана с основным потоком. Это единственная очередь, задачи которой выполняются в главном потоке программы.
В вашем примере задача для downloadQueue
выполняется в фоновом потоке. Как только код достигает значения dispatch_async(dispatch_get_main_queue(), ^{
, GCD передает эту новую задачу главному потоку, где она выполняется практически сразу, при условии, что основной поток не занят другими вещами.