Why did the UI render correctly before adding an explicit main-thread dispatch?

В iOS обновление пользовательского интерфейса должно выполняться только в основном (главном) потоке, так как UIKit не является потокобезопасным.

Короткий ответ

Что ответить на собеседовании

В iOS обновление пользовательского интерфейса должно выполняться только в основном (главном) потоке, так как UIKit не является потокобезопасным. Исключением могут быть случаи, когда вы используете специальные механизмы или фреймворки, которые позволяют обновлять UI асинхронно, но под капотом они всё равно переключаются на главный поток.

Подробный разбор

Ответ с пояснениями

В iOS обновление пользовательского интерфейса должно выполняться только в основном (главном) потоке, так как UIKit не является потокобезопасным. Исключением могут быть случаи, когда вы используете специальные механизмы или фреймворки, которые позволяют обновлять UI асинхронно, но под капотом они всё равно переключаются на главный поток.

Например, если вы загружаете данные в фоновом потоке, то после получения результата нужно переключиться на главный поток для обновления UI:

DispatchQueue.global().async {
    // Загрузка данных
    let data = loadData()
    DispatchQueue.main.async {
        // Обновление UI
        self.label.text = data
    }
}

Таким образом, обновление UI вне основного потока допустимо только если вы явно переключаетесь обратно на главный поток перед изменением элементов интерфейса.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее