Gusfat
Gusfat

Reputation: 111

UITableViewCell image loading wrong images

For now i download the image, story it in a mutable dictionary and then verify if the image was already downloaded and if not, download it and store it. As a key i use the indexPath.

This code kinda works, but from the tests i did if i scroll too fast the cell image will load the wrong one and after a split of a second it will load the right one (replacing the wrong image).

Im always clearing my thumbnail (imageView) after i call the method so i don't know why im getting this bug.

I though that maybe the if(self.imageCache.object(forKey: cacheKey) != nil) statement was true and thats why i would get multiple images, but the breakpoint didn't stop at once when i was scrolling down.

Any ideas?

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
  {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MovieCellController
        cell.thumbnail.image = UIImage()

        let cacheKey = indexPath.row

        if(self.imageCache.object(forKey: cacheKey) != nil)
        {
            cell.thumbnail.image = self.imageCache.object(forKey: cacheKey) as? UIImage
        }
        else
        {
            DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
                if let url = NSURL(string:  self.moviesCollection[indexPath.row].imageLink) {
                    if let data = NSData(contentsOf: url as URL) {
                        let image: UIImage = UIImage(data: data as Data)!
                        self.imageCache.setObject(image, forKey: cacheKey as NSCopying)
                        DispatchQueue.main.async(execute: {
                            cell.thumbnail.image = image
                        })
                    }
                }
            }
        }

        cell.name.text = moviesCollection[indexPath.row].name

        return cell

}

Upvotes: 0

Views: 1470

Answers (2)

s1ro6
s1ro6

Reputation: 160

Because the cell is reused. The reused-cell keeps its old data. The new image downloading will cost few seconds so that the reused -cell cannot change the image immediately.

You can use a placeholder-image when downloading the new image. Or you can use the 3rd part library - SDWebImage.

Upvotes: 0

Aakash
Aakash

Reputation: 2269

It is happening because the cells are reused due to which when scrolling fast the image of another cell seems to be assigned, but if fact it is the previous cell's image which is reused.

In cell's prepareForReuse method set your imageView's image to nil. Like, imageView.image = nil

Upvotes: 1

Related Questions