我正在使用 [SDWebImageDownloader.sharedDownloader downloadImageWithURL] 下载图像,选项设置为 0。我最初没有对它们做任何事情,因为我知道它们将被缓存。但是,当我稍后使用完全相同的函数显示图像时,该函数再次下载图像,而不是从缓存中获取它(图像缓存类型为 0)。在这两种情况下,图像的 url 都是相同的。我对缓存的理解不正确吗?
1 回答
享受缓存功能的最简单方法是SDWebImageManager
使用SDWebImageDownload
. SDWebImageManager
提供SDImageCache
功能,而如果您使用SDWebImageDownload
,则必须依赖NSURLCache
(有限制/问题)或编写自己的缓存代码。
此外(并且隐含在 Gustavo 的问题中),如果您只是想设置 a 的图像,UIImageView
实际上最好不要使用这些类中的任何一个,UIImageView+WebCache
而是使用类别。它拥有 的所有缓存功能SDWebImageManager
,但还提供其他优势(尤其是重用UITableViewCell
和UICollectionViewCell
对象)。
在对另一位用户的评论中,您说您正在提前下载所有图像,“只是为了将它们缓存起来,这样当用户确实想要查看图像时,他不必等待。”
这是一个很好的扩展目标,但是这种预取(有时称为急切加载,与更常见的延迟加载相反)有几个含义:
除非您确信用户确实需要所有图像,否则这是对他们移动设备的蜂窝数据计划的积极使用,所以也许您应该只在 WiFi 上执行此操作(这可以通过Reachability确定)。苹果甚至拒绝了使用过多蜂窝带宽的应用程序。
该应用程序在内存方面将比必要的更具侵略性(导致更多暂停的应用程序被终止,这不会影响您的应用程序的用户体验,但 Apple 要求我们所有人都成为好公民,不要使用超过我们需要的 RAM) . 同样,如果用户需要所有图像,那么这是一件好事,但如果不需要,则应该真正最大限度地减少内存消耗,而不是将当前会话可能不需要的东西加载到缓存中。另请注意,下载一堆可能需要下载的东西,但只是作为预防措施完成了(适度)电池影响。
如果您对后台数据进行大量请求,请确保您没有用完所有有限的网络连接(您只有五个)并且没有用大量请求积压系统。好消息是 UI
UIImageView
类别自然有利于当前的 UI(从根本上说,是一种延迟加载机制)。但是假设有 100 张图像,用户启动应用程序并向下滚动到列表底部。你真的希望#90 的请求(它在屏幕上并且用户正在等待)等待#1-89 完成吗?请参阅 WWDC 2012 视频Asynchronous Design Patterns with Blocks、GCD 和 XPC,第 7 节,“分离控制和数据流”,视频大约 48 分钟,讨论这是如何产生问题的。
如果不出意外,我会确保您使用网络链接调节器(MacOS 的硬件 IO 工具的一部分或设备上的“设置”>“常规”>“开发人员”下)测试应用程序。所以打开网络链接调节器,删除并重新安装应用程序(以清空持久存储缓存),然后用这个慢速连接启动应用程序,尝试在图像加载过程中四处导航。一个简单的“让我们开始预取所有内容”可能无法为您真正想要的慢速网络上的当前 UI 提供必要的优先级。
综上所述,您可能已经考虑了所有这些含义,如果是这样,我为对显而易见的事情进行了道歉。只是在对所有图像进行积极的预取之前必须小心。