Что является более низкоуровневым в iOS: GCD или OperationQueue?

«Что является более низкоуровневым в iOS: GCD или OperationQueue?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Grand Central Dispatch (GCD) является более низкоуровневым API. OperationQueue построен поверх GCD и предоставляет объектно-ориентированную, высокоуровневую абстракцию.

Ключевые различия:

  • GCD работает напрямую с системными потоками через очереди (DispatchQueue). Он легковесный и эффективный для простых задач.
  • OperationQueue использует GCD внутри, но добавляет возможности, отсутствующие в чистом GCD:
    • Зависимости между операциями (addDependency(_:)).
    • Отмена операций (cancel()).
    • Приоритеты операций (queuePriority).
    • Наблюдение за состоянием через KVO-совместимые свойства (isReady, isExecuting, isFinished).
    • Ограничение параллелизма (maxConcurrentOperationCount).

Примеры:

GCD (низкоуровневый):

DispatchQueue.global(qos: .userInitiated).async {
    // Выполняем работу
    let result = performHeavyCalculation()
    DispatchQueue.main.async {
        // Обновляем UI
        updateUI(with: result)
    }
}

OperationQueue (высокоуровневый):

let downloadQueue = OperationQueue()
let processQueue = OperationQueue()
processQueue.maxConcurrentOperationCount = 1

let downloadOp = BlockOperation {
    let data = downloadData()
}
let processOp = BlockOperation {
    processData()
}

// Устанавливаем зависимость: обработка начнется только после загрузки
processOp.addDependency(downloadOp)

downloadQueue.addOperation(downloadOp)
processQueue.addOperation(processOp)

Выбор: Используйте GCD для простых, атомарных задач. OperationQueue предпочтительнее для сложных операций с зависимостями, требующих отмены или тонкого управления выполнением.