我已经实现了自定义 NSCache 来存储远程下载的图像,这些图像显示在我的UITableViewCells
. 请注意,图像是异步下载的。
但是,如果我快速上下滚动,即使图像来自本地,我仍然可以看到正在刷新的图像。任何人都可以帮助我了解如何避免令人耳目一新的问题?
我已经实现了自定义 NSCache 来存储远程下载的图像,这些图像显示在我的UITableViewCells
. 请注意,图像是异步下载的。
但是,如果我快速上下滚动,即使图像来自本地,我仍然可以看到正在刷新的图像。任何人都可以帮助我了解如何避免令人耳目一新的问题?
重用 tableView 单元格是一个很好的做法,因此您需要在 更新图像cellForRowAtIndexPath
,否则图像将被弄乱。
但是,我可以建议一些优化:
提高缓存性能以使图像加载更快,
在将图像添加到单元格 imageView 时使用标准或自定义标记,cellForRowAtIndexPath
使用此公式作为哈希指示符将单元格的图像标记值与单元格索引/行号的组合(如部分 * 1000 + 行)进行比较。这应该让您知道您是否真的需要更新显示的图像,并且可能会为您节省一些缓存读取操作,
如果加载的图像很大并且您使用调整大小的版本显示在单元格上,请单独存储缩略图 - 这将为您节省可能非常昂贵的调整大小操作,
确保重新加载缓存中已经过时的图像,不要过于频繁地执行检查也很重要,因为大量的 HTTP 请求会使应用程序看起来很慢并且会更快地耗尽电池(更不用说状态栏上令人讨厌的活动指示器,因为我希望尽可能少地看到用户)。
希望能帮助到你。
在你有很多单元格的情况下,它们中的大部分将被重用,而不是创建。如果您要addSubview
为任何单元格添加按钮,则已重用的单元格将已经添加,标签文本、图像也将被重用。
在这种情况下,您可能需要检查是否需要为现有按钮设置新图像。一种简单的方法是将单元格的部分和行号存储在图像标记(或单元格标记或按钮标记等)处,该公式用于将两个数字存储在单个属性中。它会让你知道你必须重用的单元格的部分/行号。
它并不总是有效的,您可以根据自己的拥有和需要找到更好的解决方案。
在 TableView 委托的 cellForRowAtIndexPath 方法中,您需要检查图像是否在缓存中,如果没有,则需要下载它。如果存在,您需要将单元格的图像设置为缓存中的版本。我假设您没有从缓存中提取图像,而是重新下载它。