什么时候从 urlcache 的内存和磁盘中删除东西?
When exactly do things get removed from urlcache's memory and disk?
let memoryCapacity = 200 * 1024 * 1024
let diskCapacity = 1 * 1024 * 1024
let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
URLCache.shared = cache
场景 1
我将 urlcache 的内存设置为 200mb,并将磁盘 space 设置为 1mb。然后我下载一张图片。关闭互联网并强制退出应用程序,通过点击它再次启动应用程序,并触发调用(下载图像)但它立即崩溃,因为 data
是 nil
不用说,如果我关闭互联网,它仍会按预期从缓存中读取并且不会发生崩溃。
场景2
如果我将磁盘容量设置为 200mb (let diskCapacity = 200 * 1024 * 1024
)
然后即使缓存被冲出内存,图像仍然保存在磁盘中;它会一直显示!
基于这个观察,我有以下问题:
- 这样说对吗,每次您强制退出或您的应用程序因内存问题而崩溃时 warning/issue 您的缓存将被刷新,但它会使您的磁盘完好无损?
- 缓存可能会被冲出内存的任何其他原因?
- 什么时候可以删除存储在磁盘中的东西?
简答:
当应用程序终止时(或者,也可能在内存压力下),内存缓存会丢失。磁盘缓存在应用程序的多次调用中持续存在,但如果设备用完持久存储并且 OS 从缓存和临时文件夹中回收 space,则可以将其删除。
长答案:
你问:
Is it correct to say, every time you force quit or your app crashes due to a memory warning/issue your cache will get flushed, though it leaves your disk intact?
很大程度上。更准确地说,当应用程序终止时,与您的应用程序相关的所有内存都将被丢弃,并且当应用程序重新启动时,只能检索保存到持久存储的那些项目。
Any other place where cache can get flushed out of memory?
应用程序终止时,您会丢失内存缓存中的所有内容。显然还有一些其他情况可以删除项目:
- 如果您手动删除
URLCache
中的回复。
- 当您接近缓存的最大容量并尝试添加新项目时,较旧的单个项目将从缓存中删除,从而迫使较旧的项目退出。
- 网络响应通常包含缓存策略(指示响应可以安全缓存多长时间),因此它们很可能在那时被删除。
- 内存缓存可以在内存压力下合理清除(例如
.UIApplicationDidReceiveMemoryWarning
)。
When can things stored in disk get removed?
逻辑与之前的观点基本相同,除了 (a) 它可以在应用程序的调用中存活); (b) 它不会因内存压力而刷新,但当设备在持久存储上运行不足时可以将其删除。
let memoryCapacity = 200 * 1024 * 1024
let diskCapacity = 1 * 1024 * 1024
let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
URLCache.shared = cache
场景 1
我将 urlcache 的内存设置为 200mb,并将磁盘 space 设置为 1mb。然后我下载一张图片。关闭互联网并强制退出应用程序,通过点击它再次启动应用程序,并触发调用(下载图像)但它立即崩溃,因为 data
是 nil
不用说,如果我关闭互联网,它仍会按预期从缓存中读取并且不会发生崩溃。
场景2
如果我将磁盘容量设置为 200mb (let diskCapacity = 200 * 1024 * 1024
)
然后即使缓存被冲出内存,图像仍然保存在磁盘中;它会一直显示!
基于这个观察,我有以下问题:
- 这样说对吗,每次您强制退出或您的应用程序因内存问题而崩溃时 warning/issue 您的缓存将被刷新,但它会使您的磁盘完好无损?
- 缓存可能会被冲出内存的任何其他原因?
- 什么时候可以删除存储在磁盘中的东西?
简答:
当应用程序终止时(或者,也可能在内存压力下),内存缓存会丢失。磁盘缓存在应用程序的多次调用中持续存在,但如果设备用完持久存储并且 OS 从缓存和临时文件夹中回收 space,则可以将其删除。
长答案:
你问:
Is it correct to say, every time you force quit or your app crashes due to a memory warning/issue your cache will get flushed, though it leaves your disk intact?
很大程度上。更准确地说,当应用程序终止时,与您的应用程序相关的所有内存都将被丢弃,并且当应用程序重新启动时,只能检索保存到持久存储的那些项目。
Any other place where cache can get flushed out of memory?
应用程序终止时,您会丢失内存缓存中的所有内容。显然还有一些其他情况可以删除项目:
- 如果您手动删除
URLCache
中的回复。 - 当您接近缓存的最大容量并尝试添加新项目时,较旧的单个项目将从缓存中删除,从而迫使较旧的项目退出。
- 网络响应通常包含缓存策略(指示响应可以安全缓存多长时间),因此它们很可能在那时被删除。
- 内存缓存可以在内存压力下合理清除(例如
.UIApplicationDidReceiveMemoryWarning
)。
When can things stored in disk get removed?
逻辑与之前的观点基本相同,除了 (a) 它可以在应用程序的调用中存活); (b) 它不会因内存压力而刷新,但当设备在持久存储上运行不足时可以将其删除。