Sobes.tech
Middle

Кадом асбобҳо дар Grand Central Dispatch (GCD) дастрасанд?

sobes.tech AI

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