Код-ревью Middle UIKit обновлено

Код-ревью: ячейка ленты в UITableView

Вопрос

Найдите проблемы в настройке ячейки ленты.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = PostCell(style: .default, reuseIdentifier: "post")
    let post = posts[indexPath.row]
    cell.titleLabel.text = post.title
    let data = try! Data(contentsOf: post.imageURL)
    cell.photoView.image = UIImage(data: data)
    cell.layer.shadowOpacity = 0.3
    cell.layer.shadowRadius = 8
    if post.isPromo {
        cell.badge.isHidden = false
    }
    return cell
}

Коротко

Исправленная версия: dequeueReusableCell, вся статическая стилизация (тень с shadowPath) в инициализаторе ячейки, асинхронная загрузка картинки через кеширующий загрузчик с отменой в prepareForReuse, и явная установка каждого переменного свойства в обе стороны: badge.isHidden = !post.isPromo.

Что должен найти ревьюер

  1. Производительностьстрока 2
    Ячейка создаётся заново на каждую строку вместо dequeueReusableCell(withIdentifier:for:): лишние аллокации и дёрганый скролл.
  2. Производительностьстрока 5
    Синхронная загрузка картинки по сети на главном потоке: интерфейс замирает на время запроса.
  3. Ошибкастрока 5
    try! упадёт при любой сетевой ошибке.
  4. Производительностьстрока 7
    Тень без shadowPath пересчитывается по содержимому на каждом кадре.
  5. Ошибкастрока 9
    Бейдж только показывается и никогда не скрывается: после переиспользования он останется на обычных постах.

Разбор

Исправленная версия: dequeueReusableCell, вся статическая стилизация (тень с shadowPath) в инициализаторе ячейки, асинхронная загрузка картинки через кеширующий загрузчик с отменой в prepareForReuse, и явная установка каждого переменного свойства в обе стороны: badge.isHidden = !post.isPromo.

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

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