Middle
Какви инструменти са налични в Grand Central Dispatch (GCD)?
sobes.tech AI
Отговор от AI
Основни инструменти на GCD:
- Dispatch опашки (Dispatch Queues): Управляват изпълнението на блокове код. Могат да бъдат:
- Последователни (Serial): Изпълняват задачите една след друга, гарантирайки реда.
- Паралелни (Concurrent): Изпълняват задачите едновременно (в рамките на наличните системни ресурси).
- Глобални паралелни опашки (Global Concurrent Queues): Предоставени от системата, имат предварително зададени приоритети (класи на качество на услугата - QoS).
- Основна опашка (Main Queue): Специална последователна опашка, свързана с главния поток на приложението. Използва се за работа с UI.
- Групи за dispatch (Dispatch Groups): Позволяват да следите завършването на набор от асинхронни задачи.
- Бариера (Barrier Semantics): За паралелните опашки, позволява създаването на "бариера", след която се изпълняват само задачите, поставени след бариерата, докато тя не бъде преодоляна.
- Източници на dispatch (Dispatch Sources): Позволяват реагиране на системни събития (файлови операции, сигнали, таймери и др.).
- DispatchWorkItem: Обгръща блок код и може да бъде изпратен към опашка, отменен и уведомен при завършване.
Пример за създаване на последователна опашка и изпълнение на задача:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Изпълнява се асинхронно в последователната опашка
print("Задача изпълнена в последователната опашка")
}
Пример за използване на dispatch група:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Влизане в групата
concurrentQueue.async {
// Задача 1
print("Задача 1 завършена")
group.leave() // Излизане от групата
}
group.enter() // Влизане в групата
concurrentQueue.async {
// Задача 2
print("Задача 2 завършена")
group.leave() // Излизане от групата
}
group.notify(queue: .main) {
// Изпълнява се след завършване на всички задачи в групата
print("Всички задачи в групата са завършени")
}
Пример за използване на DispatchWorkItem:
let workItem = DispatchWorkItem {
print("WorkItem изпълнен")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Може да бъде отменен преди изпълнение