Apple 的 On Demand Resource System 如何将文件下载到 App 的 Main Bundle 中?
How Does Apple's On Demand Resource System download files to the App's Main Bundle?
我目前正在尝试为 AWS Cloudfront 实施 Apple 的 API 按需资源管理,因为 Apple 的 ODR 在某种程度上太不可靠了。
我注意到,当我使用 ODR 资源标记在 Assets.scnassets/ 中标记图像时,我可以使用
访问该图像
UIImage(name: resourceName)
一旦它被 NSBundleRequest 对象下载。因为我可以将下载的资源作为 UIImage 访问,所以我知道该资源位于应用程序的主包中,但我认为这是不可能的,因为包是只读的。苹果是怎么做到的?最重要的方面是能够使用这个非常简单的界面创建 UIImages。
不确定它在技术上是如何完成的,但我很确定将 ODR 归因于特定的捆绑包(通常是主要的)是故意完成的,因此您可以信赖它。
我正在使用 RxOnDemandResources 库从几十个标签中获取数百个 MP3,并且是按包完成的 -
Bundle
.main
.rx
.demandResources(withTags: tags) // tags: Set<String>
.subscribeOn(Scheduler.concurrentUser) // declare your scheduler first
.observeOn(Scheduler.concurrentMain) // declare your scheduler first
.subscribe { event in
switch event {
case .next(let progress):
self.showProgress(progress: Float(progress.fractionCompleted)) // declare your handler first
case .error(let error):
break // handle appropriately
case .completed:
if let url = Bundle.main.url(forResource: file, withExtension: "") {
os_log("url: %@", log: Log.odr, type: .info, "\(url)")
// TODO use your resource
}
}
}
.disposed(by: self.disposeBag)
回到你的问题:是的,你可以像往常一样通过特定的包 访问 ODR 资源 但有所有先决条件(检查可用性,如果需要则获取) - 即 不总是.
I know that the resource is located in the app's main bundle but I thought this was impossible because Bundles were read-only. How did apple do this?
这是幻觉。 ODR 文件被下载到应用程序包之外的目录,并且 UIImage init(named:)
之类的调用被调换以在该目录中查找。
我目前正在尝试为 AWS Cloudfront 实施 Apple 的 API 按需资源管理,因为 Apple 的 ODR 在某种程度上太不可靠了。
我注意到,当我使用 ODR 资源标记在 Assets.scnassets/ 中标记图像时,我可以使用
访问该图像UIImage(name: resourceName)
一旦它被 NSBundleRequest 对象下载。因为我可以将下载的资源作为 UIImage 访问,所以我知道该资源位于应用程序的主包中,但我认为这是不可能的,因为包是只读的。苹果是怎么做到的?最重要的方面是能够使用这个非常简单的界面创建 UIImages。
不确定它在技术上是如何完成的,但我很确定将 ODR 归因于特定的捆绑包(通常是主要的)是故意完成的,因此您可以信赖它。
我正在使用 RxOnDemandResources 库从几十个标签中获取数百个 MP3,并且是按包完成的 -
Bundle
.main
.rx
.demandResources(withTags: tags) // tags: Set<String>
.subscribeOn(Scheduler.concurrentUser) // declare your scheduler first
.observeOn(Scheduler.concurrentMain) // declare your scheduler first
.subscribe { event in
switch event {
case .next(let progress):
self.showProgress(progress: Float(progress.fractionCompleted)) // declare your handler first
case .error(let error):
break // handle appropriately
case .completed:
if let url = Bundle.main.url(forResource: file, withExtension: "") {
os_log("url: %@", log: Log.odr, type: .info, "\(url)")
// TODO use your resource
}
}
}
.disposed(by: self.disposeBag)
回到你的问题:是的,你可以像往常一样通过特定的包 访问 ODR 资源 但有所有先决条件(检查可用性,如果需要则获取) - 即 不总是.
I know that the resource is located in the app's main bundle but I thought this was impossible because Bundles were read-only. How did apple do this?
这是幻觉。 ODR 文件被下载到应用程序包之外的目录,并且 UIImage init(named:)
之类的调用被调换以在该目录中查找。