如何查看URLSession.dataTaskPublisher的当前进度?

How do I check the current progress of URLSession.dataTaskPublisher?

我正在使用 dataTaskPublisher 来获取一些数据:

func downloadData(_ req: URLRequest) {
  self.cancelToken = dataTaskPublisher(for: req).sink { /* ... */ }
}

如果在请求过程中调用函数,我想return。

目前我是:
1. 在接收器中将 cancelToken 设置为 nil 或
2. 创建并管理一个 isDownloading 变量。

是否有内置方法来检查 dataTaskPublisher 是否为 运行(以及可选的进度)?

关于从该发布者获取进度,查看 source code,我们可以看到它只是在执行基于完成块的数据任务(即 dataTask(with:completionHandler:))。但是生成的 URLSessionTaskDataTaskPublisher 使用的私有 Subscription 的私有 属性。最重要的是,这个发布者不提供任何机制来监控底层任务的进度。

正如 Denis 所指出的,您只能查询 URLSession 以获取有关其任务的信息。

我基本同意@Rob 的观点,但是您可以通过使用 URLSession 方法控制由 DataTaskPublisher 启动的 DataTask 的状态及其进度:

func downloadData(_ req: URLRequest) {
    URLSession.shared.getAllTasks { (tasks) in
        let task = tasks.first(where: { (task) -> Bool in
            return task.originalRequest?.url == req.url
        })

        switch task {
        case .some(let task) where task.state == .running:
            print("progress:", Double(task.countOfBytesReceived) / Double(task.countOfBytesExpectedToReceive))
            return
        default:
            self.cancelToken = URLSession.shared.dataTaskPublisher(for: req).sink { /* ... */ }
        }
    }
}