在UITableViewCell中加载延迟图像

时间:2009-02-10 08:32:38

标签: iphone cocoa-touch uitableview image lazy-loading

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

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

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

感谢。

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

欢迎任何其他建议

7 个答案:

答案 0 :(得分:19)

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

加载单元格时,您会向NSMutableDictionary发送一条objectForKey:消息,以检索该特定单元格的图像(基于您的唯一键)。如果它返回nil,则表示缓存中缺少图像,您需要使用背景图像加载线程来检索它。否则,您将返回要显示的表格单元格的相应图像。在内存警告上,您可以清除此图像缓存而不会产生任何不利影响(除了强制它们按需重新加载)。

答案 1 :(得分:4)

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

Loading remote images for UITableViewCell

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

答案 2 :(得分:4)

lostInTransit,

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

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/

我也很乐意与你分享你的发现。

答案 3 :(得分:3)

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

自我形象按钮是解决方案..

自我形象按钮是异步类型请求...等待响应..一次显示数据....

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

添加到您的项目......

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

在m档中制作它的对象......

你可以用.....

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

这是关于NSOperation的Tutorial示例,其中显示了如何在UITableViewCell中加载图像