Задать вопрос
GeorgeGeorge
@GeorgeGeorge
Студент

UITableView прыгают изображения полученные с сервера?

Всем привет! Получаю url изображения с сервера, загружаю картинку и ставлю ее в UIImageView, при скролле очень странно картинки себя ведут, подменяются как будто. В чем может быть дело? Видео для наглядности - https://vk.com/video-58860049_456239362

extension UIImageView {
    func load(url: URL) {
        DispatchQueue.global().async { [weak self] in
            if let data = try? Data(contentsOf: url) {
                if let image = UIImage(data: data) {
                    DispatchQueue.main.async {
                        self?.image = image
                    }
                }
            }
        }
    }
}

extension NewsViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return newsArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier) as! NewsTableViewCell
        let newsItem = newsArray[indexPath.row]
        
        cell.titleLabel?.text = newsItem.postTitle
        cell.shortDestLabel?.text = newsItem.postShortDesc
        cell.dateLabel?.text = newsItem.postDate
        
        let imageUrlString = newsItem.postImageUrl!.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        
        cell.coverImageView?.load(url: URL(string: imageUrlString!)!)
        
        return cell
    }
}


  • Вопрос задан
  • 407 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 2
briahas
@briahas
ObjC, Swift, Python
Ячейки то переиспользуются. А блок внутри load(url:) привязан к self. coverImageView, значит при переиспользовании ячейки он не обнулится и продолжит выполнение....параллельно с еще одним блоком.
Значит, надо удалять старый блок.
Ответ написан
ivanvorobei
@ivanvorobei
iOS разработчик, канал https://t.me/sparrowcode
Это система переиспользования. Вытягивается готовая ячейка и конфигурируется в методе. У меня есть видео об этой проблеме, глянуть можно тут. В видео я рассматривал трабл на примере чекмарка, но ситуация справедлива для любых элементов. Ячейку нужно конфигурировать однозначно.

Вытекающая проблема — повторная загрузка картинки. Если для ячейки с индексом 2 инфицировали загрузку изображения, а ячейка 3 была сделана из копии 2, то картинка будет установлена и для третьей ячейки. Вам нужно объявить параметр индекса в ячейке и перед установкой картинки или стартом загрузки убедится что индекс правильный.

Система переиспользования не сложная штука. Аналогичный принцип работает и в коллекциях.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы