内存缓存受iPhone的RAM限制(通常为2Gb)。但是,磁盘持久性受到64Gb或128Gb的限制。这正确吗?
是否有意义将持久性设置为超过您的内存存储量。如果您不想具有高内存占用率(并且不希望应用程序从其挂起状态中终止),它是否有用,即允许从磁盘存储还原缓存,然后返回持久化结果?
URLCache.shared
后,我看到以下注释:
- 内存容量:4兆字节(4 * 1024 * 1024 字节)
- 磁盘容量:20兆字节(20 * 1024 * 1024 字节)
- 磁盘路径:
(用户主目录)/Library/Caches/(应用程序包标识符)
没有特殊缓存要求或限制的用户应该会发现默认共享缓存实例可接受。如果此默认共享缓存实例不可接受,可以调用
+setSharedURLCache:
来设置不同的NSURLCache
实例以从此方法返回。调用者应确保在没有其他调用者引用先前设置的共享URL缓存时调用setter。这是为了防止缓存数据的存储变得意外地无法检索。
或 docs
响应大小足够小,可以合理地放入缓存中(例如,如果您提供了磁盘缓存,则响应[data]的大小必须不大于磁盘缓存大小的约5%)。
我自己添加了"data"
所以我认为我的理解是正确的。
整个缓存读取/写入/恢复的过程是如何工作的?
3. 当我第一次进行网络请求时,整个响应/错误/数据是否都会被写入/存储在缓存中,然后再写入持久存储?
4. 下一次如果我想要读取,则首先从缓存开始,如果响应未过期,则返回它。磁盘存储不会改变。
如果已过期,则会发出新的请求,并且仅在获得成功响应后,才会将响应从内存和磁盘中清除,并将新响应写入缓存和磁盘。如果新请求失败,则不会清除,而是保留旧的过期数据,因此如果我们想要(加载过期响应),则会从那里加载吗?
5. 当应用程序终止时,内存会被清空。磁盘存储保持不变,除非设备内存不足或达到大小限制。在下次启动应用程序时,内存会重新加载磁盘存储中的所有内容到缓存中。
这个缓存恢复将开始加载它存储的最新数据,然后移动到旧数据,直到它达到其大小限制或仅到达磁盘上存储的项目结尾。对吗?
6. 如果在正常情况下,用户在典型的1小时会话中进行的网络操作量约为30mb,那么我应该将缓存大小设置为20mb和30mb的磁盘存储?如果有图像怎么办?我听说图像以不同的方式存储,即1mb的图像可能需要10mb的大小。那我该如何处理?
我提出这些问题是因为我想改善应用程序中的缓存体验,并提高我的整体理解,以便不会增加应用程序的内存使用量太多,这样它就不会因为我的应用程序高内存使用率或其他应用程序需要而从其挂起状态中刷新出内存。{{*记忆使用量}}
*:我们的一些网络请求将下载缩略图,因此当我增加缓存大小限制时,需要考虑周全。