На каком потоке должен обновляться пользовательский интерфейс (UI) в iOS?

«На каком потоке должен обновляться пользовательский интерфейс (UI) в iOS?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Все операции с пользовательским интерфейсом должны выполняться на главном потоке (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) могут возвращать результат на фоновом потоке по умолчанию — всегда проверяйте документацию.