我的UITableView中有大约50个自定义单元格。我想在单元格中显示图像和标签,我从URL中获取图像。
我想要延迟加载图像,以便在加载图像时UI不会冻结。我尝试在单独的线程中获取图像,但每次单元格再次可见时我必须加载每个图像(否则重复使用单元格显示旧图像)
像Facebook这样的应用仅为当前可见的单元格加载图像,一旦加载图像,它们就不会再次加载。有人可以告诉我如何复制这种行为。
感谢。
修改的
尝试在NSMutableDictionary对象中缓存图像会在用户快速滚动时产生问题。我只在滚动完全停止并清除内存警告缓存时才获取图像。但应用程序总是会收到内存警告(由于缓存图像的大小)并在重新加载之前清除缓存。如果滚动非常快,它会崩溃。
欢迎任何其他建议
答案 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中加载图像