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
文件夹,但有两点需要注意:
-
苹果正在越来越多地关注应用程序,只使用
Documents
文件夹来创build无法轻易重新创build的用户数据,并使用Caches
文件夹轻松重新获取数据。 请参阅文件系统基础了解更多信息。 -
从iOS 11开始,只能将用户可见文档存储在“
Documents
文件夹中(请参阅WWDC 2017 Fallvideo, iOS存储最佳做法 )。 即使您内部使用了不容易重build的文件,除非意图最终将用户暴露给他们,您可以使用“Application Support
目录而不是“Documents
文件夹。
底线,人们通常会使用Caches
文件夹来实现基于持久性存储的caching。
请注意,我们经常使用双层caching机制。 将资源caching到NSCache
和Caches
文件夹。 然后,当你去检索一个资源时,首先检查NSCache
(非常快),如果没有,检查永久存储,如果不存在,从networking重新检索资源。
尽pipe如此,为了使它更加复杂, NSURLCache
提供了第三种types的caching(即NSURLSession
和NSURLConnection
透明cachingnetworking请求的响应)。 这个caching是由不明确的规则规定的(例如,它不会caching任何大小超过总caching大小5%的单个项目),并且受到networking响应提供的HTTP头的限制。 尽pipe如此,这个caching在很大程度上对你来说是透明的,并且提供了内存和持久的存储caching。 通常你可以享受NSURLCache
caching行为,绝对不需要你干预。 它是无缝的(当它工作)。