Код-ревью 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.
Что должен найти ревьюер
- Производительностьстрока 2Ячейка создаётся заново на каждую строку вместо
dequeueReusableCell(withIdentifier:for:): лишние аллокации и дёрганый скролл. - Производительностьстрока 5Синхронная загрузка картинки по сети на главном потоке: интерфейс замирает на время запроса.
- Ошибкастрока 5
try!упадёт при любой сетевой ошибке. - Производительностьстрока 7Тень без
shadowPathпересчитывается по содержимому на каждом кадре. - Ошибкастрока 9Бейдж только показывается и никогда не скрывается: после переиспользования он останется на обычных постах.
Разбор
Исправленная версия: dequeueReusableCell, вся статическая стилизация (тень с shadowPath) в инициализаторе ячейки, асинхронная загрузка картинки через кеширующий загрузчик с отменой в prepareForReuse, и явная установка каждого переменного свойства в обе стороны: badge.isHidden = !post.isPromo.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Порядок жизненного цикла UIViewController
Следующий вопрос
Таймер останавливается при скролле
Ещё по теме «UIKit»
- Неверная картинка в переиспользуемой ячейке
- Diffable data source и повторяющиеся идентификаторы
- Что делать в prepareForReuse
- reconfigureItems и reloadItems
- Ячейки с автоматической высотой
- Разница между frame и bounds
- Где брать финальный размер view
- Почему кнопка не получает нажатия