iOS-本地保存图像的最佳做法-NSCache与保存在文档目录中

iOS-本地保存图像的最佳做法-NSCache与保存在文档目录中,ios,uiimage,nsurlsession,nscache,Ios,Uiimage,Nsurlsession,Nscache,我正在开发一个类似Instagram feed的应用程序(包含图像和一些标签的单元格的TableView) 对于我从数据库中获取的所有数据,我使用数据任务(因为接收它们不需要花费太多时间),但是对于图像(它们的url是我通过数据请求获得的),我需要在本地保存以备将来使用(改善用户体验) 我的逻辑如下: 保存在NSCache或Document目录中,文件夹中的图像及其下载日期(创建一次,并在需要时附加所有其他图像)(我正在删除不是最近7天的所有文件夹),然后对于TableView,只需从那里加载,

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

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

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


期待您的建议,谢谢

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

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

请注意,我提到了用于持久存储的
缓存
文件夹,而您似乎假定将使用
文档
文件夹,但有两个注意事项:

  • 苹果对应用的要求越来越高,它只使用
    文档
    文件夹存储无法轻松重新创建的用户数据,并使用
    缓存
    文件夹存储易于重新检索的数据。有关更多信息,请参阅

  • 从iOS 11开始,您应该只将用户可见的文档存储在
    文档
    文件夹中(请参阅WWDC 2017秋季视频,)。即使您在内部使用了不易重建的文件,除非目的是最终向用户公开这些文件,否则您也会使用
    应用程序支持
    目录,而不是
    文档
    文件夹

  • 总之,通常使用
    Caches
    文件夹作为基于持久存储的缓存

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


    话虽如此,但更为复杂的是,还有第三种缓存类型,由
    NSURLCache
    提供(即网络请求的响应由
    NSURLSession
    NSURLConnection
    透明缓存)。此缓存由记录不充分的规则决定(例如,它不会缓存大小超过总缓存大小5%的任何单个项),并且受网络响应提供的HTTP头的约束。不过,该缓存的操作对您来说基本上是透明的,并提供内存缓存和持久存储缓存。通常,您可以享受
    NSURLCache
    缓存行为,而完全不需要您的干预。它是无缝的(当它工作时)。

    可能会解决您的问题。它将图像缓存在磁盘中。NSCache可能不是一个好的选择,因为当系统内存不足时,它会自动清空。@HaiFengKao我更喜欢纯swift,没有第三方库。我可以自己开始构建解决方案,我只是在寻找正确的路径。还有什么建议吗,伙计?@HaiFengKao可能会把这两个一起进化?目前他已经下载并将其存储在NSCache中,在图像“关闭”之前,他会将其存储在本地以备将来使用?你绝对可以这样做。@HaiFengKao,你认为这可能是一个有效的方法吗?再次感谢你的回答,所以只是为了让事情变得更简单-你不建议使用文档目录,您确实建议按以下顺序使用NSCache和hos文件夹的机制:案例1:签入NSCache,案例2:签入缓存目录,案例3:再次下载,后续问题:1)缓存目录中存在限制?2) 当我在线下载时,我会立即将其存储在案例1和案例2中?或者我等待NSCache将其删除,然后将其附加到缓存文件夹?3) 是否将图像保存为缓存文件夹中的文件?谢谢缓存文件夹中的限制是总可用持久存储空间(尽管您可能希望成为一个好公民,并限制应用程序可能需要非常大的存储空间)。就我个人而言,我会一直缓存到持久性存储,并在下载时立即重新缓存到NSCache,如果您正在进行延迟加载,是的;如果要进行快速加载,则可能不会。而且,是的,当保存到持久性存储时,我可能会将其作为文件写入,尽管NSURLCache使用SQLite。最后,我设法提出了一个“好的”效率解决方案,告诉我您的想法:::获取未来单元格ID的DataTask->检查该ID是否存在于presonal DB中(还不知道是否使用NSDirectory或核心数据)->如果存在->本地加载图像、文本等->如果不存在->下载->本地保存->本地加载…….不使用NSCache,仅缓存目录,