Выбор ответа Junior GCD и OperationQueue спрашивают часто обновлено

Обновление UI из фонового потока

Вопрос

Completion URLSession.dataTask пришёл на фоновой очереди. Как правильно обновить label.text?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Перейти на главную очередь: DispatchQueue.main.async { ... }. UIKit не потокобезопасен, менять view можно только на главном потоке, иначе случайные артефакты и крэши, а Main Thread Checker в Xcode сообщит о нарушении. main.async из фона безопасен. main.sync из главного это deadlock.

Варианты ответа

  1. Присвоить прямо в completion: с iOS 13 UIKit потокобезопасен для UILabel
  2. Вызвать DispatchQueue.main.sync из главного потока
  3. Перейти на главную очередь: DispatchQueue.main.async { ... }правильный ответ
  4. Обернуть присваивание в DispatchSemaphore(value: 1)

Разбор

UIKit не потокобезопасен, менять view можно только на главном потоке, иначе случайные артефакты и крэши, а Main Thread Checker в Xcode сообщит о нарушении. main.async из фона безопасен. main.sync из главного это deadlock. Семафор не переносит выполнение на главный поток. В async/await то же даёт @MainActor.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме