2016-05-15 99 views
2

我刚开始使用KingFisher。使用Kingfisher,UITableView中的图像加载不正确

当你向UITableView滚动的速度过快时,所有网络/ doadload请求都会得到备份,所以按时间停止滚动,它仍然会完成那些先前的请求。

这会导致所有图像闪烁不同的图片,直到所有备份的请求都完成为止。

这是我的代码从缓存或网络检索图像。

if ImageCache.defaultCache.cachedImageExistsforURL(finished_URL!) == true { 
      print("image is already cached.") 

      if cell.tag == indexPath.row{ 
       cell.card_imageIV.image = UIImage(imageLiteral: "ic_error") 
       KingfisherManager.sharedManager.retrieveImageWithURL(finished_URL!, optionsInfo: nil, progressBlock: nil, completionHandler: { (image, error, cacheType, imageURL) ->() in 
        cell.card_imageIV.image = image 
        print("Retrieved cached image") 
       }) 
      } 

     }else{ 
      cell.card_imageIV.kf_setImageWithURL(finished_URL!, placeholderImage: self.placeholderImage, optionsInfo: nil, completionHandler: { image, error, cacheType, imageURL in 
       print("\(card_name): Finished") 
      }) 
     } 

我已经试过了取消所有以前的下载任务,使用但并没有帮助下在https://github.com/onevcat/Kingfisher文档。

下面的代码我想:

// The image retrieving will stop. 
imageView.kf_cancelDownloadTask() 

这仅取消当前的细胞,至少从我可以做的意义。

回答

2

我和我的项目有完全相同的问题。我正在寻找一种方法来实现同样的功能:如果我滚动得非常快, - 我想取消以前的下载。这里是我的这个方法,用翠鸟库(SWIFT 3):

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentify) 
    cell?.imageView?.kf.cancelDownloadTask() 

} 

此方法必须在表视图委托声明。它将取消已经滚动的单元格的下载任务任务。

希望这会有所帮助!

+0

嗨,感谢您的回答,我也有类似的竞争条件,取消didEndDisplaying我解决了这个问题。另外在Android流行的图书馆Glide使用类似的取消方法,唯一的缺点是如果它几乎完全下载,它不会被缓存。你找到更好的解决方案吗? – Minas

+1

不,我没有办法缓存半下载(或95%下载,如果这是你想要的方式)图像。我不确定翠鸟/任何其他缓存库支持这样的事情。 –

+0

好吧,没什么大不了的,我使用你的解决方案,它工作得很好。非常感谢! – Minas