19

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

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

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

期待听到您的建议,谢谢!

4

1 回答 1

48

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

使用持久存储缓存(通常是Caches文件夹)用于不同的目的,使您无需通过某些网络请求重新检索资产,但无需将资源保存在内存中。这使它成为跨运行应用程序的会话或在您可能遇到内存压力、清除NSCache、但不想从网络重新检索资产的情况下的出色缓存机制。

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

  1. Apple 越来越注重应用程序仅使用Documents文件夹来存储无法轻松重新创建的用户数据,并使用Caches文件夹存储易于重新检索的数据。有关详细信息,请参阅文件系统基础知识

  2. 从 iOS 11 开始,您应该只在Documents文件夹中存储用户可见的文档(请参阅 WWDC 2017 秋季视频,iOS 存储最佳实践)。即使您在内部使用了不易重构的文件,除非最终将用户公开给它们,否则您将使用Application Support目录,而不是Documents文件夹。

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

注意,我们经常使用两层缓存机制。将资源缓存到文件夹和文件 夹。然后,当您去检索资源时,首先检查(非常快),如果不存在,则检查持久存储,如果不存在,则从网络中重新检索资产。NSCacheCachesNSCache

说了这么多,更复杂的是,还有第三种类型的缓存,由提供NSURLCache(即对网络请求的响应由NSURLSessionand透明地缓存NSURLConnection)。此缓存由记录不充分的规则决定(例如,它不会缓存任何大小超过总缓存大小的 5% 的单个项目),并且受网络响应提供的 HTTP 标头的约束。但是,此缓存对您来说很大程度上是透明的,并提供内存和持久存储缓存。通常,您可以在NSURLCache完全没有干预的情况下享受缓存行为。它是无缝的(当它工作时)。

于 2015-04-06T17:11:35.400 回答