iOS 9 的点播资源可以永久保留吗?

Posted

技术标签:

【中文标题】iOS 9 的点播资源可以永久保留吗?【英文标题】:Can iOS 9 on-demand resources be kept permanently? 【发布时间】:2015-10-13 02:19:44 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

"我将它们复制到 Application Support 文件夹并释放 NSBundleResourceRequest" how? @matt 是什么阻止你使用moveItemAtPath(:toPath:)moveItemAtURL(:toURL:)?这将避免重复副本。 似乎您不能对 onDemand 资源执行 moveItemAtPath() 。引发访问错误。但是 copyItemAtPath() 似乎具有相同的效果。我不确定它是如何做到的,但到目前为止,我还没有看到在空间有限的测试设备上执行此操作时出现磁盘空间不足的错误。想知道它是否在复制时立即释放资源。 @Hashman 不能使用move 并不奇怪。原件不是你搬的;它在沙盒之外。 @matt,如果您可以添加用于解决此问题的代码,那将是一个很大的帮助。【参考方案2】:

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

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

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

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

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

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

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

【讨论】:

以上是关于iOS 9 的点播资源可以永久保留吗?的主要内容,如果未能解决你的问题,请参考以下文章

IOS拦截webview加载并将网页资源保存到磁盘

iOS 按需资源 - 仅按需下载。调试

如何检测点播资源下载后的位置?

P2P技术做自有点播系统的加速,还需要和CDN一样部署很多服务器吗?

还在发愁吗?第一个用idea搭建SSM的Login小案例出现404资源无法访问错误怎么办?看这里,一招教你永久解决!

一个restful api可以从一个端点中删除两个相关资源吗?