gpt4 book ai didi

ios - 我如何确保没有重复的请求从 cellForRowAtIndexPath 中的 url 获取图像以用于 iOS 中的 UITableView

转载 作者:行者123 更新时间:2023-11-28 06:58:42 25 4
gpt4 key购买 nike

我正在尝试制作一个类似表格 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。在该单元格内,检查状态 isImageLoadedisImageLoading。如果两者都为假,则然后从 url 加载图像并将 isImageLoading 更改为 TRUE。下载图像后,将 isImageLoaded 设置为 TRUE。如果您正在缓存图像,那么您应该首先检查 isImageLoaded。如果它是 TRUE,则从缓存中获取它而不是在以后的调用中下载它。

我们需要这种机制,因为细胞正在重用内存。如果您将属性设置为您的自定义单元格,例如 cell.isImageLoaded,那么将会出现数据不匹配,并且您将在滚动时获得错误的状态,因为单元格正在重复使用彼此的内存。

希望对你有帮助

如有不明之处欢迎补充。

关于ios - 我如何确保没有重复的请求从 cellForRowAtIndexPath 中的 url 获取图像以用于 iOS 中的 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32637933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com