我正在开发一个类似于Instagram Feed的应用程序(包含图像和一些标签的单元格的表格视图)。
对于我从数据库中获取的所有数据,我使用数据任务(因为它不需要花费太多时间来接收它们),但是对于图像(它们的网址是&#39) ;我得到了数据请求),我需要在本地保存以备将来使用(改善用户体验)。
我的逻辑如下: 保存在NSCache或文档目录中,文件夹中的图像包含下载日期(创建一次并在需要时附加所有其他图像)(我删除了最近7天内没有的每个文件夹),然后对于TableView,只需从那里加载,因此tableview将平滑滚动并且不会直接从其委托方法加载url。 那么根据我的需要,哪里有更好的存储位置, NSCache或文档目录。
期待听到您的建议,谢谢!
答案 0 :(得分:38)
NSCache
和持久存储服务的目的大不相同。 NSCache
将项目保存在内存中,用于获得最佳性能。但它占用了内存(RAM),你真的应该确保如果你使用NSCache
来响应内存警告并在这些情况下清除NSCache
。当应用程序终止时,NSCache
将丢失。
使用持久存储缓存(通常是Caches
文件夹)用于不同的目的,使您无需通过某些网络请求重新检索资产,而无需将资源保留在内存中。这使得它成为运行应用程序的会话之间的一个很好的缓存机制,或者在您可能遇到内存压力的情况下,清除NSCache
,但不想从网络重新检索资产。
请注意,我提到Caches
文件夹用于持久存储,而您似乎假设有人会使用Documents
文件夹,但有两个注意事项:
Apple对于仅使用Documents
文件夹进行无法轻松重新创建的用户数据以及使用Caches
文件夹进行轻松重新检索的数据的应用程序更加特别。有关详细信息,请参阅File System Basics。
从iOS 11开始,您只应将用户可见文档存储在Documents
文件夹中(请参阅WWDC 2017秋季视频,iOS Storage Best Practices)。即使您在内部使用了不易重建的文件,除非意图最终将用户暴露给他们,否则您将使用Application Support
目录,而不是Documents
文件夹。
最重要的是,人们通常会将Caches
文件夹用于基于持久存储的缓存。
注意,我们经常使用双层缓存机制。将资源缓存到 NSCache
和Caches
文件夹。然后,当您去检索资源时,首先检查NSCache
(非常快),如果没有,请检查持久存储,如果没有,则从网络重新检索资产。
说完所有这些之后,为了使其更加复杂,还有第三种类型的缓存,由NSURLCache
提供(即网络请求的响应由NSURLSession
和{{透明地缓存1}})。此缓存由记录不良的规则决定(例如,它不会缓存大小超过总缓存大小的5%的任何单个项目),并且受网络响应提供的HTTP标头的约束。但是,此缓存对您来说非常透明,并提供内存和持久存储缓存。通常,您可以享受NSURLConnection
缓存行为,而您绝对不会干预。它是无缝的(当它工作时)。