Какой инструмент в iOS дает максимальный контроль над управлением потоками (threads)?

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

Ответ

Для максимального низкоуровневого контроля используйте Grand Central Dispatch (GCD) и DispatchQueue. Для более высокоуровневого управления задачами с зависимостями — OperationQueue.

Сравнение:

Инструмент Уровень Ключевые возможности для контроля
DispatchQueue (GCD) Низкий Точная настройка QoS (userInteractive, utility), барьеры (barrier), семафоры (DispatchSemaphore), группы (DispatchGroup), источники (DispatchSource).
OperationQueue Высокий Зависимости между операциями (addDependency), приоритеты (queuePriority), отмена (cancel()), ограничение параллелизма (maxConcurrentOperationCount), наблюдение за состоянием (KVO).

Пример DispatchQueue (барьер для thread-safe записи):

let concurrentQueue = DispatchQueue(label: "com.example.cache", attributes: .concurrent)
private var cache: [String: Data] = [:]

func set(_ data: Data, for key: String) {
    // Барьер гарантирует эксклюзивный доступ на запись
    concurrentQueue.async(flags: .barrier) {
        self.cache[key] = data
    }
}

Пример OperationQueue (зависимости и отмена):

let downloadQueue = OperationQueue()
downloadQueue.maxConcurrentOperationCount = 2

let downloadOp = BlockOperation { /* Загрузка данных */ }
let processOp = BlockOperation { /* Обработка данных */ }

// Обработка зависит от завершения загрузки
processOp.addDependency(downloadOp)

// Добавляем операции в очередь
downloadQueue.addOperations([downloadOp, processOp], waitUntilFinished: false)

// При необходимости отменяем все операции в очереди
downloadQueue.cancelAllOperations()

Вывод: DispatchQueue дает больше «сырой» власти, OperationQueue — более удобную абстракцию для сложных workflow.