如何设置iOS缓存和磁盘存储大小以及如何在应用终止后从磁盘存储恢复缓存?

Hon*_*ney 7 memory caching image-caching nsurlcache ios

我已经问过什么时候从urlcache的内存和磁盘中删除了什么?

现在我还有一些后续问题:

  1. 内存缓存受iPhone的内存(通常为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缓存的引用时调用setter.这是为了防止存储缓存数据变得意外无法恢复.

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


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

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

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

    如果它已过期,那么它将发出新请求,并且只有在获得成功响应后,它才会清除内存和磁盘的响应,并将新响应写入缓存和磁盘.如果新请求失败,那么它将不会被清除,而是只保留过期/过期数据,所以如果我们想要(加载过期响应)它将从那里加载?

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

    此缓存恢复将开始加载已存储的最新数据,然后移动到较旧的数据,直到它达到其大小限制或仅到达存储在磁盘上的项目的末尾.对?

  4. 如果在正常的一天,用户在典型的1小时会话中所做的联网数量约为30mb,那么我应该将我的缓存大小设置为20mb和30mb的磁盘存储吗?如果我有图像怎么办?我听说图像的存储方式不同,因为1mb图像可能需要10mb的大小.那我应该怎么做呢?

我问这一切是因为我想改善应用程序中的缓存体验并提高我的整体理解,所以我不会过多地增加应用程序的内存使用量*因此它不会从内存中刷新内存暂停状态由于我的应用程序高内存使用或其他需要的应用程序.


*:我们的一些网络请求将下载缩略图,因此当我增加缓存大小限制时,我需要考虑周到.

Moj*_*ini 5

如果您想深入了解内存管理,您应该深入研究较低级别的 API。URLSession、URLCache 等都是非常高级的 API。有很多关于内存帧、图像缓存、网络缓存等的 WWDC 会议。每个部分都有很多解释。我建议您观看所有 WWDC 视频(如果您没有观看)作为开始和热身。有些主题对这样的核心概念有很好的解释。

看看今年 WWDC 上的这两个:

图像和图形最佳实践

iOS 内存深度探究

我们可以坐在这里讨论您的问题数周!但为了快速回答:

  1. 是的。内存由于 RAM 大小而受到限制,磁盘由于存储大小而受到限制。设备和 iOS 可以根据需要使用最大限制。
  2. 确实如此,这是使用磁盘的主要目标之一。有一个名为交换内存的概念(如果需要,可以进行更多研究和研发)

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

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

  1. 不总是。默认情况下,只有成功的请求才会缓存(如果服务器没有请求客户端在标头中“不缓存它”)。但您可能知道,URLSession 在非常高级的 API 中具有大量用于在磁盘、内存等上进行缓存的配置。请参阅 URLSession 文档。

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

  3. HomeDirectory包含一些主要目录。iOS 对每一个的行为都不同。iOS 只会清理tmp目录(磁盘缓存所在的位置)。您可以将缓存存储在不同的目录(例如Documents)中,以防止 iOS 删除它。但重点是缓存字本身的含义。

  4. 与实际需要相比任何更少的空间甚至更多的空间都是至关重要的。它可能会破坏进程或浪费内存/磁盘。还记得链接列表发明的原因吗?您可以为不同的目的(例如图像和 JSON)使用不同的缓存。但关于图像的要点是:

图像内存使用

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

AlamofireKingfisher就是很好的例子。

结论

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