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

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

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

我的逻辑如下:保存在NSCache或文档目录中,文件夹内的图像与他们下载的date(创build一次,并追加所有其他图像,如果需要)( 我删除每个文件夹是不是从最近的7天 ),然后对于TableView,只是从那里加载,所以tableview将滚动顺利,不会直接从其委托方法加载URL。 那么根据我的需要, NSCache或文档目录可以存放在哪里。

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

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

使用持久性存储caching(通常是Caches文件夹)用于不同的目的,使您不需要通过某个networking请求重新获取资产,也不需要将资源存储在内存中。 这使得它成为跨应用程序会话的一个很好的caching机制,或者在可能遇到内存压力的情况下,清除NSCache ,但不想从networking重新获取资产。

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

  1. 苹果正在越来越多地关注应用程序,只使用Documents文件夹来创build无法轻易重新创build的用户数据,并使用Caches文件夹轻松重新获取数据。 请参阅文件系统基础了解更多信息。

  2. 从iOS 11开始,只能将用户可见文档存储在“ Documents文件夹中(请参阅WWDC 2017 Fallvideo, iOS存储最佳做法 )。 即使您内部使用了不容易重build的文件,除非意图最终将用户暴露给他们,您可以使用“ Application Support目录而不是“ Documents文件夹。

底线,人们通常会使用Caches文件夹来实现基于持久性存储的caching。

请注意,我们经常使用双层caching机制。 将资源caching到NSCacheCaches文件夹。 然后,当你去检索一个资源时,首先检查NSCache (非常快),如果没有,检查永久存储,如果不存在,从networking重新检索资源。

尽pipe如此,为了使它更加复杂, NSURLCache提供了第三种types的caching(即NSURLSessionNSURLConnection透明cachingnetworking请求的响应)。 这个caching是由不明确的规则规定的(例如,它不会caching任何大小超过总caching大小5%的单个项目),并且受到networking响应提供的HTTP头的限制。 尽pipe如此,这个caching在很大程度上对你来说是透明的,并且提供了内存和持久的存储caching。 通常你可以享受NSURLCachecaching行为,绝对不需要你干预。 它是无缝的(当它工作)。