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

时间:2015-04-03 14:59:33

标签: ios uiimage nsurlsession nscache

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

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

我的逻辑如下: 保存在NSCache或文档目录中,文件夹中的图像包含下载日期(创建一次并在需要时附加所有其他图像)(我删除了最近7天内没有的每个文件夹),然后对于TableView,只需从那里加载,因此tableview将平滑滚动并且不会直接从其委托方法加载url。 那么根据我的需要,哪里有更好的存储位置, NSCache或文档目录

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

1 个答案:

答案 0 :(得分:38)

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

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

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

  1. Apple对于仅使用Documents文件夹进行无法轻松重新创建的用户数据以及使用Caches文件夹进行轻松重新检索的数据的应用程序更加特别。有关详细信息,请参阅File System Basics

  2. 从iOS 11开始,您只应将用户可见文档存储在Documents文件夹中(请参阅WWDC 2017秋季视频,iOS Storage Best Practices)。即使您在内部使用了不易重建的文件,除非意图最终将用户暴露给他们,否则您将使用Application Support目录,而不是Documents文件夹。

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

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

    说完所有这些之后,为了使其更加复杂,还有第三种类型的缓存,由NSURLCache提供(即网络请求的响应由NSURLSession和{{透明地缓存1}})。此缓存由记录不良的规则决定(例如,它不会缓存大小超过总缓存大小的5%的任何单个项目),并且受网络响应提供的HTTP标头的约束。但是,此缓存对您来说非常透明,并提供内存和持久存储缓存。通常,您可以享受NSURLConnection缓存行为,而您绝对不会干预。它是无缝的(当它工作时)。

相关问题