按需资源(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
相关产品推荐
相关产品推荐

