12

根据文档,通过 NSBundleResourceRequest 下载的 iOS 9 按需资源仅保留到endAccessingResources被调用,并且在资源请求对象被释放时自动调用。

好的,但是当应用程序终止时,一切都被释放了。那么这是否意味着使用 NSBundleResourceRequest 下载的资源无法在应用程序终止后继续存在?我希望使用一种简单的策略,通过不包含大量资源,让我的应用程序更小,以便从 App Store 下载,然后再下载它们;但如果我无法保留这些资源,那将是行不通的。我是否希望将资源复制到其他地方并释放 NSBundleResourceRequest?

4

2 回答 2

8

我最终完全按照问题最后一句中的建议进行了操作:当资源到达时,我将它们复制到 Application Support 文件夹并释放 NSBundleResourceRequest。

这似乎有点违背按需资源的精神,但在我看来,这种精神是错误的精神;此功能不是以非常实用的方式设计的。

于 2015-10-13T18:07:18.857 回答
7

当你endAccessingResources时,资产有资格被清除(假设没有其他请求保留它)。但是,阅读ODR 的文档,不一定会立即从设备中删除资产:

当任何请求不再保留所有相关标签时,资产包就有资格被清除。与标签关联的资源可能会在设备上保留一段时间,然后才会被清除,包括跨应用程序启动。

因此,该资源可能会在您的应用程序终止后仍然存在,并且在您的应用程序下次打开时仍然存在,这取决于操作系统是否认为它需要释放空间。如果你conditionallyBeginAccessingResourcesWithCompletionHandler用来访问资源,你会得到一个布尔值,告诉你资源是否还在设备上。如果是,您可以立即开始使用它;如果不是,您可以使用beginAccessingResourcesWithCompletionHandler.

如果您想保证资源始终存在,您可以将其包含在初始下载中;或者,如果您确实想使用 ODR,则必须在其他地方复制下载的资源以保留它。

但是,制作资源的副本可能意味着您最终会在设备上获得 2 个副本 - 一个是您已复制并保留的副本,另一个是操作系统尚未删除的副本。在您复制了所有 ODR 资源之后,应用程序占用的空间可能是您在初始下载中复制所有内容时所占用的空间的两倍,至少在操作系统决定它应该清除资产之前是这样。

在 tvOS 上使用过 ODR,似乎操作系统试图将资产保留在缓存中,以便在下次使用应用程序时,尽可能多的数据仍然存在,而无需重新下载(可能存在复杂的算法)确定用户在不久的将来再次使用应用程序的可能性的背景)。如果应用程序不将资产保存在其他地方,这种“我们将在缓存中保留尽可能多的数据”的方法非常有用,但如果应用程序要复制资产并保证它们持续存在,这种方法似乎有点不必要。

最终,如果存在内存问题,缓存将自动清除,所以这只是一个表面问题,用户可能会看到您的应用程序比他们预期的要大,然后在某个时候,它会神奇地变小.

于 2015-11-04T19:38:28.010 回答