如何在滚动时避免在UITableViewCell中刷新图像?

时间:2012-05-08 17:15:46

标签: iphone objective-c ios cocoa-touch

我已经实现了自定义NSCache来存储我UITableViewCells中显示的远程下载的图像。请注意,图像是异步下载的。

但是,如果我快速向上和向下滚动,即使图像来自本地,我仍然可以看到图像被刷新。任何人都可以帮我理解如何避免令人耳目一新的问题?

2 个答案:

答案 0 :(得分:1)

重复使用tableView单元格是一个很好的做法,因此您需要更新cellForRowAtIndexPath处的图像,否则图像将会混乱。

但我可以建议一些优化:

  • 提高缓存性能,使图像加载速度更快,

  • 将图像添加到单元格imageView时使用标准或自定义标记,cellForRowAtIndexPath将单元格的图像标记值与单元格索引/行号的组合进行比较(如* 1000 +行)使用此公式作为哈希指标。这应该让你知道你是否真的需要更新显示的图像,并可能会节省一些缓存读取操作,

  • 如果加载的图片很大并且您使用调整大小的版本在单元格上显示,则单独存储缩略图 - 这将为您节省调整大小的操作,这可能非常昂贵,

  • 确保您正在重新加载缓存中已有的图像(如果它们已过时),同样重要的是不要太频繁地执行检查,因为大量的HTTP请求会使应用程序看起来很慢因为更快地消耗电池(更不用说状态栏上的烦人活动指示器,因为我希望尽可能少地看到用户)。

希望它有所帮助。


在您拥有大量单元格的情况下,大多数单元格将被重用,而不是创建。 如果要为任何单元格添加addSubview的按钮,则重复使用的单元格已添加,标签文本,图像也将重复使用。

在这种情况下,您可能需要检查是否需要将新图像设置为现有按钮。其中一种简单的方法是将单元格的部分和行号存储在图像标记(或单元格标记或按钮标记,无论如何)中,该公式用于在单个属性中存储两个数字。 它会告诉您要重复使用的单元格的部分/行号。

它并不总是有效,你可以根据你的需要找到更好的解决方案。

答案 1 :(得分:0)

在TableView委托中的cellForRowAtIndexPath方法中,您需要检查图像是否在缓存中,如果不是,则需要下载它。如果存在,则需要将单元格的图像设置为缓存中的版本。我假设你没有从缓存中提取图像而是重新下载它。