Ответ
Async и Concurrent — это разные аспекты работы с очередями в Grand Central Dispatch (GCD).
Async (Асинхронность)
- Способ отправки задачи. Задача ставится в очередь и выполняется, не блокируя текущий поток.
- Не гарантирует параллелизм. Асинхронная задача может выполняться на серийной (serial) очереди, где задачи идут строго по одной.
- Пример:
// Отправка задачи асинхронно. Текущий поток продолжает работу. DispatchQueue.global().async { // Выполнение фоновой задачи }
Concurrent (Параллелизм)
- Тип очереди. Очередь, которая может запускать несколько своих задач одновременно (если есть доступные потоки).
- Всегда требует async. Задачи на параллельной очереди по умолчанию отправляются асинхронно.
- Пример:
// Создание параллельной очереди let concurrentQueue = DispatchQueue(label: "com.example.queue", attributes: .concurrent) // Задачи на этой очереди могут выполняться параллельно concurrentQueue.async { /* Задача A */ } concurrentQueue.async { /* Задача B */ }
Ключевое отличие
async— это как отправляется задача (не дожидаясь её завершения).concurrent— это свойство очереди, определяющее, могут ли её задачи выполняться параллельно.
Сочетания:
serialQueue.async— задачи выполняются по одной, но не блокируют вызывающий поток.concurrentQueue.async— задачи могут выполняться параллельно и не блокируют вызывающий поток.