Ответ
Все операции с пользовательским интерфейсом должны выполняться на главном потоке (Main Thread). UIKit не является потокобезопасным, и его вызовы из фоновых потоков приводят к неопределенному поведению, визуальным артефактам или крашу приложения.
Правильный паттерн обновления UI из фонового потока:
// Выполняем тяжелую задачу в фоне
DispatchQueue.global(qos: .userInitiated).async {
let result = performHeavyCalculation()
// Возвращаемся на главный поток для обновления UI
DispatchQueue.main.async {
self.updateUI(with: result)
}
}
Ключевые моменты:
- Проверка потока: Убедиться, что код выполняется на главном потоке, можно с помощью
Thread.isMainThread. - Предупреждения от системы: При нарушении этого правила в консоли Xcode часто появляется предупреждение:
"Main Thread Checker: UI API called on a background thread". - Исключения: Некоторые высокоуровневые API (например,
URLSession.dataTaskс completion handler) могут возвращать результат на фоновом потоке по умолчанию — всегда проверяйте документацию.