Какви методи съществуват за поставяне на задачи в опашката на Grand Central Dispatch (GCD)?
sobes.tech AI
Отговор от 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()