iOS - 在本地保存图像的最佳实践 - NSCache 与保存在文档目录中

iOS - Best practice to save Images locally - NSCache vs Save in Document Directory

我正在开发一个类似于 Instagram 提要的应用程序(带有包含图像和一些标签的单元格的表格视图)。

对于我从数据库中获取的所有数据,我正在使用数据任务(因为接收它们不需要太多时间),但是对于图像(它们的 url我得到了数据请求),我需要在本地保存以备将来使用(改善用户体验)。

我的逻辑是这样的: 保存在 NSCache 或文档目录中,文件夹内的图像及其下载日期(创建一次并在需要时附加所有其他图像)(我正在删除不是最近 7 天的所有文件夹),然后对于 TableView,只需从那里加载 if,这样 tableview 将平滑滚动,不会直接从其委托方法加载 url。 那么根据我的需要存放在什么地方比较好呢,NSCache还是Document Directory.

期待您的建议,谢谢!

NSCache 和持久存储的用途大不相同。 NSCache 将项目保存在内存中并用于优化性能。但它会占用内存 (RAM),你真的应该确保如果你使用 NSCache,你会响应内存警告并在这些情况下清除 NSCache。当应用程序终止时,NSCache 会丢失。

使用持久存储缓存(通常是 Caches 文件夹)用于不同的目的,使您无需通过某些网络请求 re-retrieve 资产,但无需将资源保存在内存中.这使它成为跨 运行 应用程序会话的一个很好的缓存机制,或者在您可能遇到内存压力的情况下,清除了 NSCache,但不想 re-retrieve 来自网络。

请注意,我提到了用于永久存储的 Caches 文件夹,而您似乎认为人们会使用 Documents 文件夹,但有两个注意事项:

  1. Apple 对应用程序越来越讲究,只使用 Documents 文件夹存放不易重新创建的用户数据,使用 Caches 文件夹存放容易 [=58] 的数据=]d。有关详细信息,请参阅 File System Basics

  2. 从 iOS11 开始,您应该只将用户可见的文档存储在 Documents 文件夹中(参见 WWDC 2017 秋季视频,iOS Storage Best Practices)。即使您在内部使用了不容易重建的文件,除非目的是最终向用户公开这些文件,否则您将使用 Application Support 目录,而不是 Documents 文件夹。

最重要的是,人们通常会将 Caches 文件夹用于基于持久存储的缓存。

注意,我们经常使用 two-tier 缓存机制。将资源缓存到 NSCacheCaches 文件夹。然后,当你去检索资源时,首先检查NSCache(真的很快),如果没有,则检查持久存储,如果没有,则re-retrieve来自网络的资产。

综上所述,让事情变得更加复杂的是,NSURLCache 提供的第三种缓存类型(即网络请求的响应由 NSURLSession 透明地缓存,并且NSURLConnection)。此缓存由记录不完整的规则决定(例如,它不会缓存任何大小超过总缓存大小 5% 的单个项目),并受网络响应提供的 HTTP headers 的约束。不过,此缓存在很大程度上对您透明地运行,并提供内存和持久存储缓存。通常你可以享受 NSURLCache 缓存行为,完全不需要你的干预。它是无缝的(当它工作时)。