我正在尝试使用 task.progress.obeserve 跟踪文件的下载进度,在 PlayGround 中一切正常:
在React Native中,当从React Native UI调用swift代码时,它不会调用task.progress.observe:
@objc(downloadFileFromGoogleDrive:authHeader:savedEncryptedFileUri:withResolver:withRejecter:)
func downloadFileFromGoogleDrive(uri: String, authHeader: String, savedEncryptedFileUri: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
guard let url = URL(string: uri) else {
reject("Invalid URL", nil, nil)
return
}
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "GET"
urlRequest.setValue(authHeader, forHTTPHeaderField: "Authorization")
print("================================================")
let task = URLSession.shared.dataTask(with: urlRequest) {data, response, error in
if ((error) != nil) {
reject("request failed", error?.localizedDescription, error)
return
}
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
reject("download failed", String(describing: response), nil)
return
}
guard let data = data else {
reject("no data received", nil, nil)
return
}
let url = URL(fileURLWithPath: savedEncryptedFileUri)
do {
try data.write(to: url)
resolve(true)
} catch {
reject("cannot load data", String(describing: response), nil)
}
}
let observation = task.progress.observe(\.fractionCompleted) { progress, _ in
print(progress.fractionCompleted)
}
task.resume()
}
我必须将观察结果保留在 var 类中:
var observation: NSKeyValueObservation?
https://developer.apple.com/documentation/swift/using-key-value-observing-in-swift