iOS 9按需资源可以永久保存吗?

mat*_*att 11 ios9 on-demand-resources

根据文档,通过NSBundleResourceRequest下载的iOS 9按需资源仅在endAccessingResources被调用之前保留,并且在取消分配资源请求对象时自动调用它.

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

mat*_*att 7

我最后完成了问题在其最后一句中提出的建议:当资源到达时,我将它们复制到Application Support文件夹并释放NSBundleResourceRequest.

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


lea*_*ter 5

当您使用时endAccessingResources,资产就可以进行清除(假设没有其他保留该资产的请求)。但是,在阅读ODR文档时,并不一定会立即从设备中删除资产:

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

因此,该资源可能会在您的应用终止后继续存在,并且在下次您的应用打开时仍然存在,具体取决于操作系统是否认为需要释放空间。如果您用于conditionallyBeginAccessingResourcesWithCompletionHandler访问资源,则会收到一个布尔值,告诉您资源是否仍在设备上。如果是这样,则可以立即开始使用它;否则,请重新开始使用。如果不是,则可以使用进行下载beginAccessingResourcesWithCompletionHandler

如果您想保证资源将一直存在,则可以将其包括在初始下载中;否则,请执行以下操作。或者,如果您确实要使用ODR,则必须在其他位置复制下载的资源以将其保留。

但是,制作资源的副本可能意味着您最终在设备上获得了2个副本-一个已复制并持久保存,另一个尚未被操作系统删除。复制所有ODR资源后,该应用程序可能会占用的空间是如果您仅复制初始下载中的所有内容的空间的两倍,至少要等到操作系统决定清除资产后,应用程序才能使用。

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

最终,如果存在内存问题,缓存将被自动清除,因此这只是表面上的问题,用户可能会看到您的应用程序比预期的要大,然后在某些时候,它会变小。