2017-01-24 3 views
0

На данный момент я загружаю изображение, рассказываю его в изменяемом словаре, а затем проверяем, было ли изображение уже загружено, а если нет, загрузите его и сохраните. В качестве ключа я использую indexPath.Загрузка UITableViewCell неправильных изображений

Этот код работает, но из проведенных тестов, если я слишком быстро прокручиваю изображение ячейки, загрузит не тот, и после раскола секунды он загрузит правильный (заменив неправильное изображение).

Я всегда очищаю свое уменьшенное изображение (изображение) после того, как я вызываю метод, поэтому я не знаю, почему я получаю эту ошибку.

Я, хотя, возможно, заявление if(self.imageCache.object(forKey: cacheKey) != nil) было правдой, и поэтому я бы получил несколько изображений, но точка останова не прекращалась сразу, когда я прокручивался вниз.

Любые идеи?

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 

} 
+0

вы должны ввести код ячейки в файл ячейки –

+1

Я рекомендую использовать полностью асинхронный диспетчер загрузки, как описано в [LazyTableImages] (https://developer.apple.com/library/content/samplecode/LazyTableImages/Introduction/Intro .html), который также рассматривает прокрутку. И - как всегда, но не связанные с проблемой - вообще не используйте 'NSMutableArray/Dictionary',' NSURL', 'NSData' в Swift. – vadian

ответ

0

Это происходит потому, что клетки повторно из-за которой при прокрутке быстро изображение другой ячейки, кажется, быть назначен, но если фактически это изображение предыдущей ячейки, которая используется повторно.

В методе prepareForReuse в ячейке установите изображение imageView в ноль. Например, imageView.image = nil

0

Потому что ячейка используется повторно. Повторно используемая ячейка сохраняет свои старые данные. Загрузка нового изображения будет стоить несколько секунд, поэтому повторно используемая ячейка не сможет сразу изменить изображение.

При загрузке нового изображения вы можете использовать заполнитель-образ. Или вы можете использовать библиотеку третьей части - SDWebImage.