Усі черги DISPATCH_QUEUE_PRIORITY_X - це паралельні черги (це означає, що вони можуть виконувати відразу кілька завдань) і є FIFO в тому сенсі, що завдання в межах певної черги почнуть виконуватись, використовуючи порядок "спочатку в, перший - з". Це порівняно з основною чергою (від dispatch_get_main_queue ()), яка є послідовною чергою (завдання почнуть виконувати та закінчувати виконання у тому порядку, у якому вони отримані).
Отже, якщо ви надсилаєте 1000 блоків dispatch_async () на DISPATCH_QUEUE_PRIORITY_DEFAULT, ці завдання почнуть виконуватись у тому порядку, коли ви їх надіслали в чергу. Аналогічно для черг ВИСОКИЙ, НИЗЬКИЙ та НАЗАД. Все, що ви надсилаєте в будь-яку з цих черг, виконується у фоновому режимі на альтернативних потоках, подалі від вашого основного потоку програми. Тому ці черги підходять для виконання таких завдань, як завантаження фону, стиснення, обчислення тощо.
Зауважте, що порядок виконання є FIFO на основі черги. Отже, якщо ви надсилаєте 1000 завдань dispatch_async () на чотири різні паралельні черги, рівномірно розділяючи їх та надсилаючи їх на BACKGROUND, LOW, DEFAULT та HIGH (наприклад, ви запланували останні 250 завдань на HIGH черзі), дуже ймовірно, що перші завдання, які ви бачите, починатимуться з цієї ВИСОКОЇ черги, оскільки система зробила ваші наслідки, що ці завдання потрібно якомога швидше потрапити до центрального процесора.
Зауважте також, що я кажу, що "почне виконувати по порядку", але майте на увазі, що як паралельні черги речі не обов'язково БЕЗКОШТОВНО виконувати в порядку залежно від тривалості часу для кожного завдання.
Відповідно до Apple:
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
Паралельна черга відправки корисна, коли у вас є кілька завдань, які можуть працювати паралельно. Паралельна черга все ще є чергою, оскільки вона виконує завдання в порядку "перший-у-першому"; однак паралельна черга може видалити додаткові завдання до завершення попередніх завдань. Фактична кількість завдань, виконаних паралельною чергою в будь-який момент, є змінною і може динамічно змінюватися в міру зміни умов вашої програми. На кількість завдань, що виконуються паралельними чергами, впливає безліч факторів, включаючи кількість наявних ядер, обсяг роботи, що виконується іншими процесами, а також кількість та пріоритетність завдань в інших послідовних чергових відправленнях.
В основному, якщо ви надішлите ці 1000 блоків dispatch_async () до черги DEFAULT, HIGH, LOW або BACKGROUND, всі вони почнуть виконуватись в порядку, коли ви їх надсилаєте. Однак коротші завдання можуть закінчуватися і перед більш довгими. Причини цього полягають у тому, що є наявні ядра процесора або якщо поточні завдання черги виконують обчислювально неінтенсивну роботу (таким чином, система думає, що може паралельно відправляти додаткові завдання незалежно від кількості ядер).
Рівень одночасності повністю управляється системою і базується на навантаженні системи та інших внутрішньо визначених факторах. Це краса Grand Central Dispatch (системи dispatch_async ()) - ви просто робіть свої робочі одиниці як кодові блоки, встановлюєте пріоритет для них (виходячи з обраної вами черги) і дозволяєте системі обробляти решту.
Отже, щоб відповісти на ваше вище запитання: ви частково правильні. Ви "запитуєте цей код" для виконання одночасних завдань у глобальній паралельній черзі на визначеному рівні пріоритету. Код у блоці буде виконуватись у фоновому режимі, а будь-який додатковий (подібний) код буде виконуватися потенційно паралельно залежно від оцінки системи наявних ресурсів.
"Основна" черга з іншого боку (від dispatch_get_main_queue ()) - це послідовна черга (не є одночасною). Завдання, надіслані до головної черги, завжди виконуватимуться в порядку та завжди закінчуватимуться в порядку. Ці завдання також виконуватимуться в потоці користувальницького інтерфейсу, тому він підходить для оновлення вашого інтерфейсу повідомленнями про хід роботи, повідомленнями про завершення тощо.
dispatch_get_global_queue
внутрішній змінний типdispatch_queue_t myQueue
. Її легше читати, передаючи лише мою чергу до вашого `` dispatch_async`