Назад к вопросам
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() // Можно отменить до выполнения