0

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

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

4

2 回答 2

1

重用 tableView 单元格是一个很好的做法,因此您需要在 更新图像cellForRowAtIndexPath,否则图像将被弄乱。

但是,我可以建议一些优化:

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

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

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

  • 确保重新加载缓存中已经过时的图像,不要过于频繁地执行检查也很重要,因为大量的 HTTP 请求会使应用程序看起来很慢并且会更快地耗尽电池(更不用说状态栏上令人讨厌的活动指示器,因为我希望尽可能少地看到用户)。

希望能帮助到你。


在你有很多单元格的情况下,它们中的大部分将被重用,而不是创建。如果您要addSubview为任何单元格添加按钮,则已重用的单元格将已经添加,标签文本、图像也将被重用。

在这种情况下,您可能需要检查是否需要为现有按钮设置新图像。一种简单的方法是将单元格的部分和行号存储在图像标记(或单元格标记或按钮标记等)处,该公式用于将两个数字存储在单个属性中。它会让你知道你必须重用的单元格的部分/行号。

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

于 2012-05-08T17:31:25.907 回答
0

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

于 2012-05-08T17:22:17.003 回答