NSThread — это объектно-ориентированная обёртка над POSIX-потоками.
Характеристики:
Пример:
let thread = Thread {
print("Выполняюсь в кастомном потоке")
}
thread.start()
Когда использовать:
GCD — высокоуровневый API для управления параллелизмом.
Ключевые компоненты:
DispatchQueue
)DispatchGroup
)DispatchSemaphore
)Пример:
DispatchQueue.global(qos: .background).async {
// Фоновая работа
DispatchQueue.main.async {
// Обновление UI
}
}
Преимущества:
OperationQueue — высокоуровневая абстракция над GCD.
Ключевые особенности:
Operation
(можно наследовать)Пример:
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 2
let downloadOp = BlockOperation {
// Загрузка данных
}
let processOp = BlockOperation {
// Обработка данных
}
processOp.addDependency(downloadOp)
queue.addOperations([downloadOp, processOp], waitUntilFinished: false)
DispatchGroup — механизм GCD для отслеживания группы задач.
Основное применение:
Пример:
let group = DispatchGroup()
group.enter()
networkService.fetchData {
group.leave()
}
group.enter()
database.load {
group.leave()
}
group.notify(queue: .main) {
// Все задачи завершены
}
Характеристика | NSThread | GCD | OperationQueue | DispatchGroup |
---|---|---|---|---|
Уровень абстракции | Низкий | Средний | Высокий | Средний (часть GCD) |
Управление потоками | Ручное | Автоматическое | Автоматическое | Автоматическое |
Отмена операций | Нет | Нет | Да | Нет |
Зависимости | Нет | Нет | Да | Нет |
QoS | Через свойства | Встроенная | Встроенная | Использует QoS очередей |
Синхронизация | Вручную | Через очереди | Через зависимости | Групповое ожидание |
NSThread:
GCD:
OperationQueue:
DispatchGroup:
Swift 5.5+ предлагает новые механизмы:
async/await
вместо GCD/OperationQueueTaskGroup
вместо DispatchGroupActor
для синхронизациивыбор инструмента зависит от конкретной задачи. NSThread дает максимальный контроль, GCD — баланс производительности и удобства, OperationQueue — мощные абстракции для сложных сценариев, а DispatchGroup — специализированный инструмент для группировки задач. В новых проектах предпочтительнее использовать Swift Concurrency, но понимание этих механизмов остается важным для работы с существующим кодом и глубокого понимания многопоточности в iOS.