我有一个 SwiftUI 项目,我在其中使用 Apple 的按需资源(ODR)。
我想显示一个进度条,指示资源的下载进度。
我试过的:
以下代码请求 ODR 资源,将其存储NSBundleResourceRequest
在静态属性中,以便在其他地方可用:
class OnDemandResources {
static var request: NSBundleResourceRequest?
func loadMusic() {
OnDemandResources.request = NSBundleResourceRequest(tags: Set(["Music"]))
OnDemandResources.request?.conditionallyBeginAccessingResources { resourcesAvailable in
DispatchQueue.main.async {
if resourcesAvailable {
//Resource is already on the device. No need to download.
} else {
//Resource needs to be downloaded.
OnDemandResources.request?.beginAccessingResources { error in
DispatchQueue.main.async {
if error == nil {
//Success
}
}
}
}
}
}
}
}
然后我UIViewRepresentable
用来连接一个UIProgressView
,将视图的observedProgress
属性设置为上述静态请求对象的progress
属性:
struct ProgressBar: UIViewRepresentable {
func makeUIView(context: Context) -> UIProgressView {
let progressView = UIProgressView()
// Use the static NSBundleResourceRequest:
progressView.observedProgress = OnDemandResources.request?.progress
return progressView
}
func updateUIView(_ uiView: UIProgressView, context: Context) {
}
}
根据文档,设置observedProgress
属性应该会导致进度值自动更改:
设置此属性后,进度视图会使用从 Progress 对象接收到的信息自动更新其进度值。
最后,我ProgressBar
在 SwiftUI 视图中使用我的,如下所示:
struct MyView: View {
var body: some View {
ProgressBar()
}
}
结果:
进度条从不显示任何进度;它只是一个空白栏。
问题:
为什么我不ProgressBar
显示 ODR 下载进度?我究竟做错了什么?这是这样做的方法,还是有更简单的方法?
谢谢!