我正在尝试制作一个类似表格 View 的 instagram 来显示图像。我也在缓存目录中缓存图像。
一切都很好,但是每当我快速滚动然后快速返回时,我最终会在 cellForRowAtIndexPath() 方法中发出两个下载相同图像的请求。有什么可靠的方法可以避免重复请求吗?
我不想在单元格出队时取消请求(我知道很多人似乎都这样做)。但是,我正在寻找一种方法,如果图像不在缓存目录中,我可以发出一个请求。请让我知道我该怎么做。
这是我用来从 url 中提取图像的代码。请原谅变量命名不当。我还在测试。
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)){ [unowned self] in
let imageData = NSData(contentsOfURL: imageurl!)
let imagefromURL:UIImage = UIImage(data: imageData!)!
let imageData1 = UIImageJPEGRepresentation(imagefromURL, 1)
dispatch_async(dispatch_get_main_queue()) { [unowned self] in
imageData1.writeToFile(getImagePath, atomically: true)
if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
cell.contentImage.image = imagefromURL
cell.spinner.stopAnimating()
}
}
}
最佳答案
您必须在 NSMutableDictionary
中保留所有行的状态。该字典将在单个数组中,数组中的字典数应等于表中的单元格数。
在该字典中保留以下键:
BOOL : isImageLoaded
BOOL : isImageLoading
String : 图片名称(此图片名称应该是唯一的,并使用 从缓存中获取图像)
现在,在 cellForRowAtIndexPath:
方法中,从数组中获取字典对象。数组的 index
将是该单元格的 index path
。在该单元格内,检查状态 isImageLoaded
和 isImageLoading
。如果两者都为假,则然后从 url 加载图像并将 isImageLoading
更改为 TRUE
。下载图像后,将 isImageLoaded
设置为 TRUE
。如果您正在缓存图像,那么您应该首先检查 isImageLoaded
。如果它是 TRUE
,则从缓存中获取它而不是在以后的调用中下载它。
我们需要这种机制,因为细胞正在重用内存。如果您将属性设置为您的自定义单元格,例如 cell.isImageLoaded
,那么将会出现数据不匹配,并且您将在滚动时获得错误的状态,因为单元格正在重复使用彼此的内存。
希望对你有帮助
如有不明之处欢迎补充。
关于ios - 我如何确保没有重复的请求从 cellForRowAtIndexPath 中的 url 获取图像以用于 iOS 中的 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32637933/