根据文档,通过NSBundleResourceRequest下载的iOS 9按需资源仅在调用endAccessingResources
之前保留,并且在资源请求对象被解除分配时自动调用 。
好的,但是当应用终止时,所有都会被取消分配。那么这是否意味着使用NSBundleResourceRequest下载的资源在应用终止后无法生存?我希望使用一个简单的策略,通过不包含大量资源,然后下载它们,使我的应用程序更小,以便从App Store下载;但如果我无法保留那些资源,那就行不通。我是否希望将资源复制到其他地方并释放NSBundleResourceRequest?
答案 0 :(得分:7)
我最后完成了问题在其最后一句中提出的建议:当资源到达时,我将它们复制到Application Support文件夹并释放NSBundleResourceRequest。
这似乎有点违背了按需资源的精神,但在我看来,精神是错误的精神;此功能并非以非常实用的方式设计。
答案 1 :(得分:5)
当您endAccessingResources
时,资产有资格进行清除(假设没有其他请求持有保留)。但是,阅读the documentation for ODR,并不一定意味着资产将立即从设备中删除:
当任何请求不再保留所有关联的标记时,资产包有资格进行清除。与标记关联的资源可能会在清除之前保留在设备上一段时间,包括跨应用程序启动。
因此,资源可能会在您的应用程序终止后继续存在,并且在您的应用程序下次打开时仍然存在,具体取决于操作系统是否认为需要释放空间。如果使用conditionallyBeginAccessingResourcesWithCompletionHandler
访问资源,您将获得一个布尔值,告诉您资源是否仍在设备上。如果是,您可以立即开始使用它;如果不是,您可以使用beginAccessingResourcesWithCompletionHandler
开始下载。
如果您想保证资源始终存在,您可以将其包含在初始下载中;或者,如果你肯定想使用ODR,你必须在其他地方复制下载的资源以保留它。
但是,制作资源副本可能意味着您最终在设备上创建了2个副本 - 一个是您已复制并保留的副本,另一个是操作系统尚未删除的副本。复制完所有ODR资源后,可能是应用程序占用的空间是初始下载中所有内容的两倍,至少在操作系统决定清除资产之前是这样。
在tvOS上使用了ODR后,操作系统似乎试图将资产保留在缓存中,这样,在下次使用应用程序时,尽可能多的数据仍然存在而无需重新加载(可能存在背景中的复杂算法确定用户在不久的将来再次使用app的可能性。这种方法我们可以尽可能多地在缓存中保存数据"如果应用程序不会在其他地方保留资产,那就太棒了,但如果应用程序要复制资产并保证它们仍然存在,那么这似乎有点不必要。
最终,如果存在内存问题,缓存将自动清除,因此这只是一个美容问题,用户可能会看到您的应用程序比预期的要大,然后在某些时候,它会神奇地变小了。