Обновление UILabel из фоновой очереди: что не так с этим кодом
Экран баланса на UIKit:
func loadBalance() {
DispatchQueue.global().async {
let balance = self.service.fetchBalance() // сетевой вызов
self.balanceLabel.text = "\(balance) ₽"
}
}
На тестовых устройствах баланс иногда обновляется с задержкой, иногда не обновляется вовсе, а изредка приложение падает.
Где здесь ошибка?
- Ошибки нет: сетевой вызов обязан выполняться в фоне, а присвоение текста метке — атомарная операция, которой всё равно, из какой очереди её вызвали
- UI обновляется вне главного потока — работа с вью не потокобезопасна, отсюда пропущенные перерисовки и падения
- Ошибка в сильном захвате self в замыкании, других проблем в этом фрагменте нет
- Ошибка в интерполяции строки: символ валюты нужно добавлять форматтером, иначе label не перерисуется
