Ответ
Для максимального низкоуровневого контроля используйте 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.