我目前正在尝试为AWS Cloudfront实施Apple的按需资源管理API,因为Apple的ODR某种程度上过于不可靠。
我注意到,当我使用ODR资源标签在Assets.scnassets /中标记图像时,我可以使用
访问该图像UIImage(name: resourceName)
一旦它被 NSBundleRequest 对象下载。因为我可以将下载的资源作为UIImage访问,所以我知道该资源位于应用程序的主捆绑包中,但是我认为这是不可能的,因为捆绑包是只读的。苹果是怎么做到的?最重要的方面是能够使用这个非常简单的界面来创建UIImage。
答案 0 :(得分:2)
我知道资源位于应用程序的主捆绑包中,但是我认为这是不可能的,因为捆绑包是只读的。苹果是怎么做到的?
这是一种幻想。 ODR文件被下载到应用程序捆绑包之外的目录中,并且像UIImage init(named:)
这样的调用被欺骗以查找该目录。
答案 1 :(得分:1)
不确定技术上是如何完成的,但是我可以肯定,将ODR归因于特定的捆绑包(通常是main)是有目的的,因此您可以依靠它。
我正在使用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资源,但具有所有先决条件(检查可用性,如果需要则进行获取)-即并非总是。