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

标签 ios swift uitableview

我正在尝试制作一个类似表格 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/

相关文章:

class - 在 Swift 中实例化类时将值传递给要使用的类

ios - delaysContentTouches = false 不在 UITableView Swift 中工作?

swift - 从 tableView 中删除 StructItem

iphone - 使用 Jeff Lamarches 脚本加载模型

ios - SocketRocket 在尝试安装 socketrocket 以便我可以使 PonyDebugger 工作之后,我收到 3 个 Apple Match-O 链接器错误

iOS:键盘上方的工具栏

ios - Swift 动画问题

ios - 我无法摆脱请求失败 : bad request (400)

ios - 控制 collectionView 从 collectionView Cell 中滚动

ios - 当动画 View 高度改变时,UIView 圆角断裂