Ios 从UITableView单元格内的url异步加载图像-滚动时加载错误的图像
我有一个在单元格中显示图像的tableView。大多数情况下会显示正确的图像,但偶尔会显示错误的图像(通常是在快速向下滚动tableView时)。我异步下载图像Ios 从UITableView单元格内的url异步加载图像-滚动时加载错误的图像,ios,swift,uitableview,asynchronous,uiimage,Ios,Swift,Uitableview,Asynchronous,Uiimage,我有一个在单元格中显示图像的tableView。大多数情况下会显示正确的图像,但偶尔会显示错误的图像(通常是在快速向下滚动tableView时)。我异步下载图像 cell.profImg.getImgFromUrl(link: man.img, contentMode: cell.profImg.contentMode) 这里我做异步请求: extension UIImageView { func getImgFromUrl(link link:String, contentMode mode
cell.profImg.getImgFromUrl(link: man.img, contentMode: cell.profImg.contentMode)
这里我做异步请求:
extension UIImageView {
func getImgFromUrl(link link:String, contentMode mode: UIViewContentMode) {
guard
let url = NSURL(string: link)
else {return}
contentMode = mode
NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
guard
let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200,
let mimeType = response?.MIMEType where mimeType.hasPrefix("image"),
let data = data where error == nil,
let image = UIImage(data: data)
else { return }
dispatch_async(dispatch_get_main_queue()) { () -> Void in
self.image = image
}
}).resume()
}
}
我认为这是因为当您开始加载HTTP映像时,没有重置
UIImageView
的内容。因此,当重新使用单元格时,将显示先前加载的图像
您只需通过类似于self.image=nil
(如果需要空白图像)或self.image=myPlaceholderImage
(如果在加载期间需要占位符图像)的方式启动getImgFromUrl
。以下是如何将其集成到代码中:
extension UIImageView {
func getImgFromUrl(link link: String, contentMode mode: UIViewContentMode) {
guard
self.image = nil // Here you can put nil to have a blank image or a placeholder image
let url = NSURL(string: link)
else { return }
contentMode = mode
NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
guard
let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200,
let mimeType = response?.MIMEType where mimeType.hasPrefix("image"),
let data = data where error == nil,
let image = UIImage(data: data)
else { return }
dispatch_async(dispatch_get_main_queue()) { () -> Void in
self.image = image
}
}).resume()
}
}
但是我认为你应该考虑使用。此库为UIImageView提供了一个类别,支持来自web的远程图像。对您来说,这将更高效、更简单。我认为问题在于,当快速滚动时,异步请求完成时,单元格可能会退出队列并重新用于另一个单元格,从而更新错误的单元格。什么是self.image?当您使用这个时?您使用的是swift,所以我建议您使用库来延迟加载图像。@Wolverine-这是一个隐藏在这里的更微妙的问题,但更根本的问题是在异步检索新图像时,无法删除回收单元的图像。