Обновление таблицы прямо в completion URLSession
URLSession.shared.dataTask(with: url) { data, _, _ in
guard let data else { return }
let items = try? JSONDecoder().decode([Item].self, from: data)
self.items = items ?? []
self.tableView.reloadData()
}.resume()
В приложении наблюдаются редкие зависания интерфейса и краши без внятного стека. Что не так с этим кодом?
- Нужно вызывать resume() внутри замыкания, иначе задача выполняется дважды
- Замыкание выполняется на фоновой очереди, а работать с UIKit можно только на главном потоке
- Ошибки нет: URLSession всегда возвращает completion на главном потоке, поэтому таблицу можно обновлять прямо здесь
- Проблема в try?: при ошибке разбора данные теряются молча, из-за этого и возникают краши
