从 URLSession.shared.dataTask 获取当前进度在调用 Swift 的 React Native UI 中不起作用

问题描述 投票:0回答:1

我正在尝试使用 task.progress.obeserve 跟踪文件的下载进度,在 PlayGround 中一切正常:

enter image description here

在React Native中,当从React Native UI调用swift代码时,它不会调用task.progress.observe:

enter image description here

@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()
}
swift react-native
1个回答
0
投票

我必须将观察结果保留在 var 类中:

var observation: NSKeyValueObservation?

https://developer.apple.com/documentation/swift/using-key-value-observing-in-swift

© www.soinside.com 2019 - 2024. All rights reserved.