Вступить в клуб →
средняявопросПлатформы и жизненный цикл приложения

Обновление UILabel из фоновой очереди: что не так с этим кодом

Экран баланса на UIKit:

func loadBalance() {
    DispatchQueue.global().async {
        let balance = self.service.fetchBalance()   // сетевой вызов
        self.balanceLabel.text = "\(balance) ₽"
    }
}

На тестовых устройствах баланс иногда обновляется с задержкой, иногда не обновляется вовсе, а изредка приложение падает.

Где здесь ошибка?

  • Ошибки нет: сетевой вызов обязан выполняться в фоне, а присвоение текста метке — атомарная операция, которой всё равно, из какой очереди её вызвали
  • UI обновляется вне главного потока — работа с вью не потокобезопасна, отсюда пропущенные перерисовки и падения
  • Ошибка в сильном захвате self в замыкании, других проблем в этом фрагменте нет
  • Ошибка в интерполяции строки: символ валюты нужно добавлять форматтером, иначе label не перерисуется

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела