Ответ
Только из главного потока (Main Thread). UIKit не является потокобезопасным фреймворком. Обновление UI из фонового потока приводит к неопределённому поведению, крашам (EXC_BAD_ACCESS) или визуальным артефактам.
Почему? Все операции отрисовки и обработки пользовательского ввода координируются циклом событий (RunLoop) главного потока. Прямое изменение свойств UIView (например, frame, text, backgroundColor) из другого потока нарушает эту синхронизацию.
Как безопасно обновлять UI из фонового потока?
-
Используйте
DispatchQueue.main:DispatchQueue.global(qos: .background).async { // Выполняем фоновую задачу let result = heavyCalculation() DispatchQueue.main.async { // Обновляем UI с результатом self.label.text = result self.view.backgroundColor = .systemBlue } } -
Используйте
@MainActor(Swift 5.5+): Аннотация гарантирует выполнение метода или свойства в главном потоке.@MainActor func updateUI() { label.text = "Updated" } -
Используйте
UIScheduler(Combine): Для планирования работы издателя (Publisher) на главный поток.viewModel.$title .receive(on: DispatchQueue.main) .assign(to: .text, on: label)
Исключение: Некоторые операции, связанные с чтением (например, получение frame), могут работать в фоне, но это недокументированное поведение. Всегда придерживайтесь правила обновления UI только из главного потока.