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

chu*_*tar 9 swift combine

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

func downloadData(_ req: URLRequest) {
  self.cancelToken = dataTaskPublisher(for: req).sink { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

如果在请求正在进行时调用该函数,我想返回。

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

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

Rob*_*Rob 6

关于从这个发布者那里获取进度,查看源代码,我们可以看到它只是在做一个基于完成块的数据任务(即dataTask(with:completionHandler:))。但由此带来URLSessionTask的是私人的私有财产Subscription的使用DataTaskPublisher。最重要的是,此发布者不提供任何机制来监控基础任务的进度。

正如丹尼斯指出的那样,您只能查询URLSession有关其任务的信息。


Den*_*hin 6

我大多同意@Rob,但是您可以使用以下方法控制DataTask发起者的状态DataTaskPublisher及其进度URLSession:

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 { /* ... */ }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)