【问题标题】:How to set iOS cache and disk storage size and how does cache get restored from disk storage after app termination?如何设置 iOS 缓存和磁盘存储大小以及如何在应用程序终止后从磁盘存储中恢复缓存?
【发布时间】:2019-03-10 03:45:42
【问题描述】:

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

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

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

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

控制点击URLCache.shared后,我看到以下cmets:

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

没有特殊缓存要求或约束的用户 应该找到可接受的默认共享缓存实例。如果这 不接受默认共享缓存实例,+setSharedURLCache: 可以调用以设置要返回的不同NSURLCache 实例 从这个方法。调用者应注意确保 setter 在没有其他调用者引用 先前设置的共享 URL 缓存。这是为了防止存储缓存数据 避免意外地无法恢复。

docs

响应大小足够小,可以合理地放入缓存中。 (例如,如果您提供磁盘缓存,则响应 [数据] 必须不大于磁盘缓存大小的大约 5%。)

我自己包含了数据

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


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

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

  2. 下次如果我想要 read 那么它首先从缓存开始,然后如果响应 not 过时/过期,那么它将返回它。磁盘存储不会有任何改变。

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

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

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

  4. 如果在正常情况下,用户在典型的 1 小时会话中使用的网络量约为 30mb,那么我是否应该将缓存大小设置为 20mb 和 30mb 的磁盘存储空间?如果我有图像怎么办?我听说图像的存储方式不同,因为 1mb 的图像可能需要 10mb 的大小。那么我应该如何管理呢?

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


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

【问题讨论】:

  • 关于赏金描述的编辑:...最后但并非最不重要的是,如果 URLCache 提供这样的缓存服务 (用于图像缓存) 如此轻松,那么为什么还有第三个政党框架?他们有什么好处?

标签: ios caching memory nsurlcache image-caching


【解决方案1】:

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

看看今年 WWDC 的这两个:

Image and Graphics Best Practices

iOS Memory Deep Dive

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

  1. 是的。内存因内存大小而受限,而磁盘因存储大小而受限。设备和 iOS 可以根据自己的需要使用最大限制。
  2. 没错,这是使用磁盘的主要目标之一。有一个名为 Swap Memory 的概念(如果您愿意,可以进行更多调查和研发)

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

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

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

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

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

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

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

AlamofireKingfisher 就是很好的例子。

结论

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

【讨论】:

  • 您对设置缓存和磁盘大小的建议在哪里?我应该如何找到合适的尺码?
  • 我在我的答案中添加了结论部分,并为您提供了一个合适的解决方案。
  • 我明白你在说什么,但你能举个例子并应用你的一般规则吗? dastet dard nakone
  • 我喜欢,但不幸的是,我正处于繁重的项目中间,我没有时间为您构建该文档。这需要很多时间并且取决于。互联网上有许多有用的教程可以帮助您解决这个问题。那么也许你应该用你的测试文件提出另一个问题,社区会提供帮助。最后,请随时在此处提及此答案并通知我。
  • 如果您觉得我的回答有帮助,请不要忘记点赞并将其标记为答案。谢谢。
猜你喜欢
  • 2016-08-23
  • 2022-12-20
  • 2015-08-18
  • 2013-12-26
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
相关资源
最近更新 更多