我刚刚开始学习SwiftUI,但没有时间进行合并。我对此不太了解。如何在ProgressView中将值传递给下载进度。在下载过程中如何配置ODRManager以及如何传输值,不是0并立即为1,而是0.0 ... 0.1.0.2 ... 0.8,0.9,1.0我想知道仅SwiftUI,以及使用Combine或其他方法的不同方法和方法。
非常感谢。
SwiftUI代码
import SwiftUI struct ProgressView: View { @Binding var value: Float var body: some View { GeometryReader { geometry in ZStack(alignment: .leading) { Rectangle() .frame(width: geometry.size.width, height: geometry.size.height) .opacity(0.3) .foregroundColor(.gray) Rectangle() .frame(width: min(CGFloat(self.value) * geometry.size.width, geometry.size.width), height: geometry.size.height) .foregroundColor(.blue) .animation(.linear) }.cornerRadius(45.0) } } } struct ContentView: View { @State var progressValue: Float = 0.0 var body: some View { VStack { Button(action: { //here is the function to download from ondemand }) { Text("Download") .padding(.init(top: 10, leading: 30, bottom: 10, trailing: 30)) .background(Color.blue) .foregroundColor(.white) .cornerRadius(14) } .padding(.bottom, 30) ProgressView(value: $progressValue) .environmentObject(self.manager) .frame(width: 250, height: 20) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
按需管理者代码
class ODRManager: NSObject {
var resourceRequest : NSBundleResourceRequest?
var progress:Float = 0.0
func fetchODRResourceWithName(fileName: String) {
guard self.resourceRequest == nil else {return}
self.resourceRequest = NSBundleResourceRequest(tags: [fileName])
progress = Float((resourceRequest?.progress.fractionCompleted)!)
self.resourceRequest!.progress.addObserver(self, forKeyPath: "fractionCompleted", options: .new, context: nil)
self.resourceRequest?.conditionallyBeginAccessingResources(completionHandler: { (resourceAvailable) in
if !resourceAvailable {
self.resourceRequest!.beginAccessingResources { err in
guard err == nil else {
print(err as Any)
return
}
print("downloading..")
}
} else {
print("was downloaded")
}
})
}
func stopDownloadingFile() {
guard self.resourceRequest != nil else {
return
}
self.resourceRequest!.endAccessingResources()
self.resourceRequest!.progress.removeObserver(self, forKeyPath: "fractionCompleted")
self.resourceRequest!.progress.cancel()
self.resourceRequest = nil
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "fractionCompleted" {
DispatchQueue.main.async { [weak self] in
self.progress = Float((self?.resourceRequest!.progress.fractionCompleted)!)
}
}
}
}
我刚刚开始学习SwiftUI,但没有时间进行合并。我对此不太了解。如何在ProgressView中将值传递给下载进度。如何配置ODRManager ...
class ODRManager: ObservableObject {
var resourceRequest : NSBundleResourceRequest?
@Published var progress:Float = 0.0
... rest of code as before ...
}
目前尚不清楚ODRManager
和ContentView
之间的关系,但是我建议在它们之间引入一些中间模型(以避免紧密耦合,例如