Выбор ответа Junior GCD и OperationQueue спрашивают часто обновлено
Обновление UI из фонового потока
Вопрос
Completion URLSession.dataTask пришёл на фоновой очереди. Как правильно обновить label.text?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Перейти на главную очередь: DispatchQueue.main.async { ... }. UIKit не потокобезопасен, менять view можно только на главном потоке, иначе случайные артефакты и крэши, а Main Thread Checker в Xcode сообщит о нарушении. main.async из фона безопасен. main.sync из главного это deadlock.
Варианты ответа
- Присвоить прямо в completion: с iOS 13 UIKit потокобезопасен для
UILabel - Вызвать
DispatchQueue.main.syncиз главного потока - Перейти на главную очередь:
DispatchQueue.main.async { ... }правильный ответ - Обернуть присваивание в
DispatchSemaphore(value: 1)
Разбор
UIKit не потокобезопасен, менять view можно только на главном потоке, иначе случайные артефакты и крэши, а Main Thread Checker в Xcode сообщит о нарушении. main.async из фона безопасен. main.sync из главного это deadlock. Семафор не переносит выполнение на главный поток. В async/await то же даёт @MainActor.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «GCD и OperationQueue»
- Асинхронная Operation
- Барьер для потокобезопасного кеша
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- Как дождаться нескольких запросов в GCD
- Задача на Swift: операции с зависимостями и критический путь
- Задача на Swift: OperationQueue с ограничением параллельности