You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按需资源(ODR)退出App后是否持久化?如何避免重复下载?

ODR资源保存与重复下载问题解答

是否需要手动保存已下载的ODR资源?

不需要手动保存。Apple的ODR(按需资源)机制由系统全权负责资源的存储管理:

  • 当NSBundleResourceRequest对象被释放后,已下载的资源并不会立即被删除。系统会根据设备剩余存储空间、资源使用频率、Xcode中配置的资源优先级等因素,自主决定是否保留这些资源。
  • 你重启App后未触发重复下载,正是因为系统判定当前设备有足够空间,且该资源近期被使用过,所以暂时保留了下来。

如何确保ODR数据不会重复下载?

可以通过以下几点避免不必要的重复下载:

  • 优先使用条件检查方法:每次需要资源时,先调用conditionallyBeginAccessingResources(completionHandler:),该方法会直接校验本地是否存在对应标签的资源。如果返回true,直接使用本地资源即可;仅当返回false时,再调用beginAccessingResources触发下载。你的代码已经采用了这种正确逻辑。
  • 合理管理请求实例:对于长期需要的资源,无需频繁销毁和重建NSBundleResourceRequest对象。虽然对象释放后资源不会立刻被删除,但长期持有对应请求实例(记得在不需要时调用endAccessingResources),能让系统更倾向于保留这类资源。
  • 优化标签配置:将关联资源归类到同一标签下,避免为相同资源创建不同标签的请求。比如你代码中prefetch标签包含hd1和hd2,后续单独请求hd1时,系统会识别到资源已存在,不会重复下载。
  • 避免主动删除资源:除非确定不再需要某些资源,否则不要调用NSBundleResourceRequest的evictResources方法,主动删除会导致下次使用时必须重新下载。

针对你代码的补充说明

在buttonDidTapped方法中,你重新创建了针对hd1标签的request,旧的request被释放,但之前下载的hd1资源仍会被系统保留。再次调用fetchImage时,conditionallyBeginAccessingResources会检测到本地已有该资源,直接返回true,因此不会触发重复下载。

内容的提问来源于stack exchange,提问作者iroh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:35:40