Назад к вопросам
Middle
74
questionbank
Какие инструменты доступны в Grand Central Dispatch (GCD)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Основные инструменты GCD:
- Диспечерские очереди (Dispatch Queues): Управляют выполнением блоков кода. Бывают:
- Последовательные (Serial): Выполняют задачи по одной, гарантируя порядок.
- Параллельные (Concurrent): Выполняют задачи одновременно (в пределах доступных системных ресурсов).
- Глобальные параллельные очереди (Global Concurrent Queues): Предоставляются системой, имеют предопределенные приоритеты (качественные классы сервиса - QoS).
- Основная очередь (Main Queue): Специальная последовательная очередь, связанная с главным потоком приложения. Используется для работы с UI.
- Диспечерские группы (Dispatch Groups): Позволяют отслеживать завершение набора асинхронных задач.
- Семантика барьеров (Barrier Semantics): Для параллельных очередей, позволяет создать "барьер", после которого выполняются только задачи, поставленные после барьера, пока барьер не будет преодолен.
- Диспечерские источники (Dispatch Sources): Позволяют реагировать на системные события (файловые операции, сигналы, таймеры и т.д.).
- DispatchWorkItem: Оборачивает блок кода и может быть отправлен в очередь, отменен и уведомлен о завершении.
Пример создания последовательной очереди и выполнения задачи:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Выполняется асинхронно в последовательной очереди
print("Задача выполнена в последовательной очереди")
}
Пример использования диспечерской группы:
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() // Можно отменить до выполнения