Почему при обновлении таблицы и получении продуктов нужно переключаться на main queue в iOS
Что проверяют
Понимаете ли вы, почему требование главного потока это не формальность, а следствие устройства UIKit и цикла отрисовки. Заодно смотрят, знаете ли современный способ гарантировать это типом, а не дисциплиной.
Как отвечать
UIKit рассчитан на один поток. Его состояние читает и коммитит транзакцию Core Animation главный цикл выполнения, поэтому правка свойств вью из фонового потока это гонка со слоем отрисовки. Симптомы плавающие: то ничего, то не обновившийся экран, то падение в глубине раскладки, то артефакты. Отсутствие падения ничего не доказывает, это просто повезло.
Колбэки сети приходят не на главную очередь: URLSession вызывает обработчик на своей очереди, поэтому после разбора ответа переключение обязательно.
fetchProducts { [weak self] products in
DispatchQueue.main.async {
self?.products = products
self?.tableView.reloadData()
}
}Современнее выражать это типом: пометить вью-модель или метод как @MainActor, и тогда за принадлежность к главному актору отвечает компилятор, а фоновую работу приходится выносить явно.
Важное уточнение про таблицу. На главную очередь переносится не только reloadData, но и правка массива-источника. Модель и таблица обязаны меняться в одном проходе: если данные подменили в фоне, а строки вставляете адресно, прилетит падение про несовпадение числа строк до и после обновления.
Полезно упомянуть Main Thread Checker: он ловит вызовы UIKit с фонового потока в отладочной сборке.
Где спотыкаются
Отвечают шаблоном ситуация, задача, действие, результат. Это схема для рассказа про опыт, а спрашивают устройство, и заученная рамка вокруг двух предложений по делу скорее вредит.
Заворачивают в DispatchQueue.main.sync. С главного потока это мгновенная взаимная блокировка. Нужен async, а синхронный вариант только с фонового и с пониманием, зачем он тут.
Переносят на главную очередь всё подряд, включая разбор ответа и обработку картинок. Скролл начинает дёргаться, и вопрос про потоки превращается в вопрос про профилирование. На главном потоке только работа с интерфейсом.