当你endAccessingResources
时,资产有资格被清除(假设没有其他请求保留它)。但是,阅读ODR 的文档,不一定会立即从设备中删除资产:
当任何请求不再保留所有相关标签时,资产包就有资格被清除。与标签关联的资源可能会在设备上保留一段时间,然后才会被清除,包括跨应用程序启动。
因此,该资源可能会在您的应用程序终止后仍然存在,并且在您的应用程序下次打开时仍然存在,这取决于操作系统是否认为它需要释放空间。如果你conditionallyBeginAccessingResourcesWithCompletionHandler
用来访问资源,你会得到一个布尔值,告诉你资源是否还在设备上。如果是,您可以立即开始使用它;如果不是,您可以使用beginAccessingResourcesWithCompletionHandler
.
如果您想保证资源始终存在,您可以将其包含在初始下载中;或者,如果您确实想使用 ODR,则必须在其他地方复制下载的资源以保留它。
但是,制作资源的副本可能意味着您最终会在设备上获得 2 个副本 - 一个是您已复制并保留的副本,另一个是操作系统尚未删除的副本。在您复制了所有 ODR 资源之后,应用程序占用的空间可能是您在初始下载中复制所有内容时所占用的空间的两倍,至少在操作系统决定它应该清除资产之前是这样。
在 tvOS 上使用过 ODR,似乎操作系统试图将资产保留在缓存中,以便在下次使用应用程序时,尽可能多的数据仍然存在,而无需重新下载(可能存在复杂的算法)确定用户在不久的将来再次使用应用程序的可能性的背景)。如果应用程序不将资产保存在其他地方,这种“我们将在缓存中保留尽可能多的数据”的方法非常有用,但如果应用程序要复制资产并保证它们持续存在,这种方法似乎有点不必要。
最终,如果存在内存问题,缓存将自动清除,所以这只是一个表面问题,用户可能会看到您的应用程序比他们预期的要大,然后在某个时候,它会神奇地变小.