Ответ
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 предпочтительнее для сложных операций с зависимостями, требующих отмены или тонкого управления выполнением.