Какие способы существуют для размещения задач в очереди Grand Central Dispatch (GCD)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Существуют следующие способы размещения задач в очереди GCD:
-
Асинхронное выполнение (async): Задача добавляется в очередь, и выполнение сразу же продолжается на текущем потоке, не дожидаясь завершения задачи в очереди.
DispatchQueue.global().async { // Код задачи } -
Синхронное выполнение (sync): Задача добавляется в очередь, и текущий поток блокируется до тех пор, пока задача в очереди не завершится. Избегайте использования sync на главном потоке для задач, выполняющихся длительное время, чтобы не блокировать UI.
DispatchQueue.global().sync { // Код задачи, текущий поток будет ждать } -
Отложенное выполнение (asyncAfter): Задача добавляется в очередь с указанной задержкой. Выполнение начнется не раньше указанного времени.
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { // Код задачи выполнится через 2 секунды } -
Выполнение в группе (DispatchGroup): Задачи могут быть добавлены в DispatchGroup для синхронизации их завершения. Можно дождаться выполнения всех или быть уведомленным (notify) после их завершения.
let group = DispatchGroup() group.enter() DispatchQueue.global().async { // Задача 1 group.leave() } group.enter() DispatchQueue.global().async { // Задача 2 group.leave() } group.notify(queue: .main) { // Все задачи в группе завершены } -
Применение итераций (concurrentPerform): Позволяет выполнить заданный блок кода
iterationsраз параллельно на конкурентной очереди.DispatchQueue.concurrentPerform(iterations: 100) { index in // Код, выполняющийся для каждого индекса параллельно } -
DispatchWorkItem: Оборачивает блок кода и позволяет отменить выполнение задачи до ее старта или после добавления в очередь, если она еще не начала выполняться.
var workItem: DispatchWorkItem? workItem = DispatchWorkItem { // Код задачи } DispatchQueue.global().async(execute: workItem!) // Можно отменить задачу, если она еще не началась // workItem?.cancel()