【发布时间】:2019-03-10 03:45:42
【问题描述】:
我已经问过When exactly do things get removed from urlcache's memory and disk?
现在我还有一些后续问题:
内存缓存受限于 iPhone 的内存(通常为 2Gb)。但是磁盘持久性受到 64Gb 或 128Gb 的限制。对吗?
拥有比内存更多的持久性是否有意义。如果您不想占用大量内存(并且不希望应用程序从挂起状态终止),即允许从磁盘存储中恢复缓存然后返回持久化结果,它是否有用?
控制点击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%。)
我自己包含了数据
所以我认为我的理由是正确的。
读/写/恢复缓存的整个过程是如何工作的?
我的意思是当我第一次发出网络请求时,整个响应/错误/数据是否被写入/存储在缓存中,然后进入持久化?
-
下次如果我想要 read 那么它首先从缓存开始,然后如果响应 not 过时/过期,那么它将返回它。磁盘存储不会有任何改变。
如果它已过期,那么它将发出一个新请求,并且仅在 获得成功的响应后,它将从内存和磁盘中清除响应,并将新响应写入缓存和磁盘。如果新 请求失败然后它不会清除,而是会保留 陈旧/过期的数据,所以如果我们想要(加载过期的响应)它 会从那里加载吗?
-
当应用程序终止时,内存会被刷新。除非设备内存不足或您已达到大小限制,否则磁盘存储将保持不变。下次启动应用程序时,内存会将磁盘存储中的任何内容重新加载到缓存中。
此缓存恢复将开始加载最新数据 存储然后移动到较旧的数据,直到它 达到其大小限制或刚刚达到存储项目的末尾 磁盘。对吧?
- 如果在正常情况下,用户在典型的 1 小时会话中使用的网络量约为 30mb,那么我是否应该将缓存大小设置为 20mb 和 30mb 的磁盘存储空间?如果我有图像怎么办?我听说图像的存储方式不同,因为 1mb 的图像可能需要 10mb 的大小。那么我应该如何管理呢?
我问这一切是因为我想改善应用程序中的缓存体验并提高我的整体理解,因此我不会过多增加应用程序的内存使用量*,因此它不会被冲出由于我的应用程序内存使用率高或其他应用程序需要,内存从其暂停状态。
*:我们的一些网络请求将下载缩略图,因此在增加缓存大小限制时需要考虑周到。
【问题讨论】:
-
关于赏金描述的编辑:...最后但并非最不重要的是,如果 URLCache 提供这样的缓存服务 (用于图像缓存) 如此轻松,那么为什么还有第三个政党框架?他们有什么好处?
标签: ios caching memory nsurlcache image-caching