33

我的 UITableView 中有大约 50 个自定义单元格。我想在从 URL 获取图像的单元格中显示图像和标签。

我想做一个延迟加载图像,以便在加载图像时 UI 不会冻结。我尝试在单独的线程中获取图像,但每次单元格再次可见时我都必须加载每个图像(否则重用单元格会显示旧图像)

像 Facebook 这样的应用程序只为当前可见的单元格加载图像,一旦加载了图像,就不会再次加载它们。有人可以告诉我如何复制这种行为。

谢谢。

编辑
尝试在 NSMutableDictionary 对象中缓存图像会在用户快速滚动时产生问题。仅当滚动完全停止并清除内存警告时的缓存时,我才会获取图像。但是应用程序总是会收到内存警告(由于缓存的图像大小)并在重新加载之前清除缓存。如果滚动非常快,它会崩溃。

欢迎任何其他建议

4

7 回答 7

19

在后台线程上加载图像仍然是一个好主意。如果您不想每次都重新加载它们,我建议您设置一个 NSMutableDictionary 并将图像存储在其中。您可以使用一些唯一标识符,例如行 ID 甚至图像的名称,作为每个图像的键。

加载单元格时,您将向 NSMutableDictionary 发送 objectForKey: 消息以检索该特定单元格的图像(基于您的唯一键)。如果它返回 nil,则意味着图像从缓存中丢失,您需要后台图像加载线程来检索它。否则,您将获得适当的图像以供表格单元格显示。在出现内存警告时,您可以清除此图像缓存而不会产生不利影响(除了根据需要强制重新加载它们)。

于 2009-02-10T14:00:39.443 回答
4

我刚刚通过使用自定义 NSOperation 以排队方式加载图像并将它们存储到静态 NSMutableDictionary 作为缓存来成功解决了同样的问题。下面是我用来解决问题的代码基础的链接。

为 UITableViewCell 加载远程图像

最好阅读论坛中的所有主题,以帮助您了解实际情况。

于 2009-02-11T12:45:21.647 回答
4

在运输途中丢失,

我遇到了类似的问题,在探索许多不同的可能解决方案时,我发现了这篇博文:

davidgolightly.blogspot.com/2009/02/asynchronous-image-caching-with-iphone.html

我还建议您从苹果开发者网站下载 URLCache 示例:

developer.apple.com/iphone/prerelease/library/samplecode/URLCache/ _

这是关于这个问题的另一篇文章:

www.markj.net/iphone-asynchronous-table-image/

我也希望你分享你的发现。

于 2009-05-25T17:37:10.187 回答
3

延迟加载就像同步类型的请求..意味着等待响应

自我图像按钮是解决方案..

自我图像按钮是异步类型请求..不要等待响应..一次只显示数据....

你可以从github下载文件夹....

添加到您的项目...

在 xib ..在图像视图中,将类更改为自我图像按钮...

在 m 文件中制作它的对象...

您可以使用.....

于 2014-09-16T08:42:08.273 回答
2

对于那些有兴趣并且像我一样懒惰的人,我想建议 UIImageView 图像的惰性/缓存网络的开源(MIT 许可)实现:SDWebImage

于 2011-11-16T23:50:09.810 回答
0

UITableView 在后台线程中具有图像缓存和调整大小/设置:

http://blog.slaunchaman.com/2011/08/12/gcd-example-updated-now-with-more-speed/

于 2012-05-13T21:55:36.113 回答
0

这是关于 NSOperation 的教程,示例展示了如何在 UITableViewCell 中延迟加载图像

于 2013-05-18T21:01:46.620 回答