代码之家  ›  专栏  ›  技术社区  ›  mfaani

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

  •  5
  • mfaani  · 技术社区  · 6 年前

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

    1. 拥有一个比你的记忆存储更持久的东西有意义吗。如果您不想占用大量内存(也不想应用程序从挂起状态终止),即允许从磁盘存储还原缓存,然后返回持久化结果,这是否有用?

    单击控件后 URLCache.shared 我看到以下评论:

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

    没有特殊缓存要求或约束的用户 应找到可接受的默认共享缓存实例。如果这个 +setSharedURLCache: 可以调用设置不同的 NSURLCache 要返回的实例 从这个方法。呼叫者应注意确保设置者 在没有其他调用者引用

    或者 docs

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

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


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

    1. 我是说,当我第一次提出网络请求时,整个响应/错误/数据 书面 /存储在缓存中然后进入持久性?

    2. 下次如果我想的话 然后它首先从缓存开始,然后如果响应是 过期/过期,则会退回。磁盘存储不会有任何改变。

      如果它过期了,那么它将发出一个新的请求,并且只有在 如果得到成功的响应,它将清除内存和磁盘中的响应,并将新的响应写入缓存和磁盘。如果新的 请求失败,则不会清除,而是保留 过时/过期的数据,所以如果我们想(加载过期的响应)它 从那里装货?

    3. 此高速缓存还原将开始加载具有的最新数据 然后移动到旧的数据上,直到 达到其大小限制或刚好达到存储在 磁盘。对吗?

    4. 如果在正常情况下,一个用户在一个典型的1小时会话中的网络容量大约是30mb,那么我应该将缓存大小设置为20mb和30mb的磁盘存储吗?如果我有图像呢?我听说图像的存储是不同的,因为在一个1mb的图像可以采取10mb的大小。那我该怎么办呢?

    我问这些是因为我想改善应用程序中的缓存体验,提高我的整体理解,这样我就不会过多地增加应用程序的内存使用量,这样它就不会因为我的应用程序内存使用量高或其他应用程序需要而从挂起状态中冲出内存。


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

    1 回复  |  直到 5 年前
        1
  •  3
  •   mfaani    6 年前

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

    看看今年WWDC的这两个:

    Image and Graphics Best Practices

    iOS Memory Deep Dive

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

    1. 没错,这是使用磁盘的主要目标之一。有一个概念叫做 交换内存

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

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

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

    2. NSURLRequestCachePolicy 文档。以及 this  NSURLRequestCachePolicy 根据您选择的策略,它的行为有所不同,可以清除以前的缓存或将其保留到下次成功。

    3. 这个 主目录 包含一些主目录。iOS的表现各不相同。iOS只会清除 目录(磁盘缓存所在的目录)。您可以将缓存存储在不同的目录中,如 文件 单词本身。

    4. 离实际需要的空间越少,甚至越大,就越重要。它可能会损坏进程或浪费内存/磁盘。还记得链表发明的原因吗?您可以为不同的目的(如图像和json)使用不同的缓存。但关于图像的重点是:

    Image Memory Use

    Alamofire Kingfisher

    结论

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