Вступить в клуб →
лёгкаявопросСеть, данные и конкурентность

Обновление таблицы прямо в 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?: при ошибке разбора данные теряются молча, из-за этого и возникают краши

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

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

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

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