iOS9个点播资源能否永久保留?

Can iOS 9 on-demand resources be kept permanently?

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

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

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

这似乎有些违背点播资源的精神,但我认为这种精神是错误的精神;这个功能的设计不是很实用。

当您 endAccessingResources 时,该资产有资格被清除(假设没有其他请求对其保留)。但是,阅读 the documentation for ODR,并不一定意味着资产会立即从设备中删除:

An asset pack is eligible for purging when all of the associated tags are no longer retained by any request. The resources associated with a tag may remain on the device for some time before it is purged, including across app launches.

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

开始下载

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

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

在电视上使用过 ODROS,OS 似乎试图将资产保留在缓存中,以便下次使用该应用程序时,尽可能多的数据是仍然存在而无需重新下载(后台可能有复杂的算法来确定用户在不久的将来再次使用该应用程序的可能性)。 "we'll keep as much data in the cache as we can" 这种方法在应用程序不在其他地方持久保存资产时非常有用,但如果应用程序要复制资产并保证它们持久存在,则似乎有点不必要。

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