Ответ
Главный поток (Main Thread / UI Thread)
- Назначение: Единственный поток, в котором можно безопасно работать с пользовательским интерфейсом (UIKit, SwiftUI). Все обновления UI должны выполняться здесь.
- Особенности:
- Обрабатывает события пользователя (касания, жесты).
- Запускает цикл выполнения (RunLoop) для обработки этих событий.
- Блокировка главного потока приводит к "зависанию" интерфейса.
Фоновый поток (Background Thread)
- Назначение: Выполнение ресурсоемких или длительных операций, чтобы не блокировать главный поток и не нарушать отзывчивость UI.
- Типичные задачи: Сетевые запросы, работа с базой данных, сложные вычисления, обработка изображений.
- Особенности:
- Создается системой (например, через GCD или OperationQueue).
- Запрещено обновлять UI с фонового потока.
Правило и пример
Правило: Всё, что связано с UI, должно выполняться на главном потоке. Все тяжелые операции — на фоновых.
Неправильно: Приведет к крешу или неопределенному поведению.
DispatchQueue.global().async {
let data = self.fetchDataFromNetwork() // Долгая операция в фоне - ОК
self.label.text = "Данные: (data)" // ПОПЫТКА ОБНОВИТЬ UI НЕ ИЗ ГЛАВНОГО ПОТОКА - ОШИБКА!
}
Правильно: Возвращаем обновление UI на главный поток.
DispatchQueue.global().async {
// 1. Выполняем тяжелую работу в фоне
let data = self.fetchDataFromNetwork()
let processedData = self.process(data)
// 2. Возвращаем результат на главный поток для обновления UI
DispatchQueue.main.async {
self.label.text = "Данные: (processedData)"
self.imageView.image = UIImage(data: processedData)
}
}
Как получить главный поток:
DispatchQueue.main.async { }OperationQueue.main.addOperation { }- В SwiftUI изменения
@State,@Publishedавтоматически планируются на главный поток.