Ответ
Все операции с пользовательским интерфейсом должны выполняться на Main Thread (главной очереди).
Причина: Фреймворки UIKit и AppKit не являются потокобезопасными. Обновление UI из фонового потока приводит к неопределенному поведению, визуальным артефактам и крешам приложения.
Правильный паттерн:
- Тяжелые операции (сеть, вычисления, чтение с диска) выполняются в фоновом потоке.
- Результат передается на главный поток для обновления UI.
Пример:
// 1. Работа в фоне
DispatchQueue.global(qos: .userInitiated).async {
let imageData = try? Data(contentsOf: heavyImageURL)
let image = UIImage(data: imageData ?? Data())
// 2. Возврат на главный поток для UI
DispatchQueue.main.async {
self.imageView.image = image // Безопасное обновление
self.activityIndicator.stopAnimating()
}
}
Как проверить? Используйте утверждение (assert) для отладки:
assert(Thread.isMainThread, "Этот метод должен вызываться на главном потоке!")
Нарушение этого правила — одна из самых частых причин нестабильности UI в iOS-приложениях.