Вопрос проверяет понимание ограничений UIKit и правил безопасного обновления интерфейса.
UI всегда должен обновляться на главном потоке. UIKit не является потокобезопасным. Обновление UI из фонового потока может привести к непредсказуемым багам и крэшам. Даже если кажется, что все работает, это небезопасно. Поэтому любые изменения интерфейса нужно явно выполнять на main thread.
UIKit спроектирован с расчетом на однопоточное использование.
UIKit не thread-safe, и это ключевая причина ограничения.
Если обновлять UI из background thread:
возможны race conditions;
нарушается целостность состояния;
появляются редкие и трудноуловимые баги.
К обновлению UI относятся:
Изменение текста и изображений.
Изменение layout и constraints.
Анимации.
Навигация и презентация экранов.
Пример с GCD:
DispatchQueue.main.async {
self.tableView.reloadData()
}
Пример с async/await:
await MainActor.run {
updateUI()
}
Обновление UI внутри completion handler без возврата на main.
Обновление UI после завершения background операции.
Предположение, что callback всегда приходит на main.
Любые изменения UI должны выполняться на главном потоке. Это жесткое правило UIKit, нарушение которого приводит к нестабильному поведению приложения.