Ответ
DispatchQueue.main — это последовательная (serial) очередь, привязанная к главному потоку приложения.
Характеристики:
-
Serial (последовательная) природа:
DispatchQueue.main.async { print("Task 1 started") // Долгая операция заблокирует следующие задачи print("Task 1 finished") } DispatchQueue.main.async { // Эта задача начнется ТОЛЬКО после завершения Task 1 print("Task 2 executed") } -
Связь с UI:
- Все операции с UIKit/AppKit/SwiftUI должны выполняться на главной очереди
- UIKit не является потокобезопасным
-
Типичное использование:
// Обновление UI после фоновой операции DispatchQueue.global(qos: .userInitiated).async { let processedData = self.processLargeDataset() DispatchQueue.main.async { self.updateUI(with: processedData) self.tableView.reloadData() } }
Важные правила:
- Не блокируйте главную очередь долгими операциями (>16 мс), чтобы избежать лагов интерфейса
- Используйте
DispatchQueue.main.asyncдля UI-обновлений из фоновых потоков - Для асинхронных операций в Swift Concurrency используйте
MainActor:@MainActor func updateUI(with data: Data) { // Автоматически выполняется на главной очереди label.text = data.description }
Альтернативы для фоновых задач:
DispatchQueue.global()— глобальные concurrent очереди- Кастомные очереди с разными QoS (Quality of Service)
OperationQueueдля сложных зависимостей