如何设置iOS缓存和磁盘存储大小,以及应用终止后如何从磁盘存储中还原缓存?

时间:2018-10-04 16:59:56

标签: ios caching memory nsurlcache image-caching

我已经问过When exactly do things get removed from urlcache's memory and disk?

现在我还有其他后续问题:

  1. 内存缓存受iPhone的ram(通常为2Gb)限制。但是磁盘的持久性受到64Gb或128Gb的限制。正确吗?

  2. 拥有持久性比存储存储有意义吗?如果您不想占用大量内存(并且不希望应用从挂起状态终止),即允许从磁盘存储中还原缓存,然后返回持久结果,是否有用?

在控件上单击URLCache.shared后,我看到以下注释:

  
      
  • 内存容量:4兆字节(4 * 1024 * 1024字节)
  •   
  • 磁盘容量:20兆字节(20 * 1024 * 1024字节)
  •   
  • 磁盘路径:(user home directory)/Library/Caches/(application bundle id)
  •   
     

没有特殊缓存要求或约束的用户   应该找到可接受的默认共享缓存实例。如果这   默认共享缓存实例不可接受,+setSharedURLCache:   可以调用以设置要返回的其他NSURLCache实例   从这种方法。呼叫者应注意确保设置者   在没有其他调用者引用该调用者的时间被调用   先前设置的共享URL缓存。这是为了防止存储缓存数据   变得不可思议。

所以我认为我的理由是正确的。


读取/写入/还原缓存的整个过程如何工作?

  1. 我的意思是,当我第一次发出网络请求时,是整个响应/错误/数据被写入 /存储在缓存中,然后持久化吗?

  2. 下次,如果我想阅读,那么它首先从缓存开始,然后,如果响应不是陈旧/过期,它将返回它。磁盘存储没有任何变化。

    如果已过期,则仅在 获得成功的响应后,它将清除内存和磁盘中的响应,并将新响应写入缓存和磁盘中。如果新 请求失败,则不会清除,而只会保留 陈旧/过期的数据,因此如果我们想要(加载过期的响应) 会从那里加载吗?

  3. 当应用终止时,内存被清空。除非设备内存不足或达到大小限制,否则磁盘存储将保持不变。下次启动应用程序时,内存会将磁盘存储中的所有内容重新加载到缓存中。

    此缓存还原将开始加载具有 存储,然后移至较旧的数据,直到 达到其大小限制或仅达到存储在其中的项目的末尾 磁盘。对吧?

  4. 如果在正常的一天中,用户进行一次典型的1小时会话的网络连接量约为30mb,那么我应该将缓存大小设置为20mb,还是将磁盘存储量设置为30mb?如果我有图像怎么办?我听说图像的存储方式不同,因为1mb的图像可能占用10mb的大小。那我该如何处理呢?

我之所以问所有这些问题,是因为我想改善应用程序的缓存体验并提高我的整体了解,因此我不会过多增加应用程序的内存使用率*,因此不会被冲走。由于我的应用程序内存使用率过高或需要其他应用程序,因此内存从挂起状态开始运行。


*:我们的某些网络请求将下载缩略图,因此在增加缓存大小限制时需要体谅。

1 个答案:

答案 0 :(得分:2)

如果您想深入了解内存管理,则应深入了解较低级别的API。 URLSession,URLCache等是非常高级的API。关于内存帧,图像缓存,网络缓存等,有很多WWDC会话。每个部分都有很多说明。我建议您观看所有WWDC视频(如果没有的话)以进行启动和热身。一些主题对此类核心概念有很好的解释。

从今年的WWDC中查看以下两项:

Image and Graphics Best Practices

iOS Memory Deep Dive

我们可以坐在这里讨论您的问题几个星期!但为了快速回答:

  1. 是的。内存受内存大小限制,磁盘受内存大小限制。该设备和iOS设备可以根据需要最大限度地发挥作用。
  2. 确实,这是使用磁盘的主要目标之一。有一个名为交换内存的概念(如果需要,可以进行更多调查和研发)
  

压缩数据临时移至磁盘,以在内存中为最近使用的数据腾出空间

但是内存在其帧中拥有自己的缓存。有时缓存会降低性能而不是提高性能。因为它是框架

  1. 并非总是如此。默认情况下,仅成功请求将被缓存(如果服务器未请求客户端在标头中“不对其进行缓存”)。但是,您可能知道,URLSession具有大量配置,可以在非常高级的API中对磁盘,内存等进行缓存。请参阅URLSession文档。

  2. 请参阅 NSURLRequestCachePolicy 文档。而this是一个很好的教程。  NSURLRequestCachePolicy根据您选择的策略,它的行为有所不同,可以清除先前的缓存或将其保留到下一次成功。

  3. HomeDirectory 包含一些主目录。 iOS的行为各不相同。 iOS只会清理 tmp 目录(磁盘缓存所在的目录)。您可以将缓存存储在其他目录中,例如 Documents ,以防止iOS将其删除。但是重点是 cache 单词本身的含义。

  4. 根据实际需要分配更少的空间甚至更多的空间都是至关重要的。它可能会破坏进程或浪费内存/磁盘。还记得链接列表发明的原因吗?您可以具有用于不同用途的不同缓存,例如图像和JSON。但是关于图片的重点是:

Image Memory Use

这些都是Foundation框架的核心,所有已知的第三方都只是它们的包装。因此,它们唯一的好处是:基于数千位贡献者的知识和更高级别的API的预定义默认值。

AlamofireKingfisher是很好的例子。

结论

正确的缓存大小取决于用例。取决于数据变量的数量,图像数量,每个图像的大小,访问同一图像的频率等,例如,如果您不断更改缓存中的图像,则实际上可能会对电池寿命产生不利影响!决定合适的缓存大小的最佳方法是进行测试。在“仪器”下运行该应用程序以测量性能和电池使用情况。继续增加缓存大小,直到无法分辨出性能差异。至少在测试条件下,这是您所需的最大尺寸。然后减小尺寸,直到性能勉强可以接受为止,以确定最小的可接受尺寸。正确的尺寸介于这两个尺寸之间,具体取决于您认为重要的东西。