如何查看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:)
)。但是生成的 URLSessionTask
是 DataTaskPublisher
使用的私有 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 { /* ... */ }
}
}
}
我正在使用 dataTaskPublisher
来获取一些数据:
func downloadData(_ req: URLRequest) {
self.cancelToken = dataTaskPublisher(for: req).sink { /* ... */ }
}
如果在请求过程中调用函数,我想return。
目前我是:
1. 在接收器中将 cancelToken
设置为 nil 或
2. 创建并管理一个 isDownloading
变量。
是否有内置方法来检查 dataTaskPublisher
是否为 运行(以及可选的进度)?
关于从该发布者获取进度,查看 source code,我们可以看到它只是在执行基于完成块的数据任务(即 dataTask(with:completionHandler:)
)。但是生成的 URLSessionTask
是 DataTaskPublisher
使用的私有 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 { /* ... */ }
}
}
}