如何检查URLSession.dataTaskPublisher的当前进度? [英] How do I check the current progress of URLSession.dataTaskPublisher?

查看:91
本文介绍了如何检查URLSession.dataTaskPublisher的当前进度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm using a dataTaskPublisher to fetch some data:

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

如果在请求进行中调用了该函数,我想返回.

If the function is called while the request is in progress, I would like to return.

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

Currently I either:
1. Set the cancelToken to nil in the sink or
2. Crate and manage a isDownloading variable.

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

Is there a built-in way to check if the dataTaskPublisher is running (and optionally its progress)?

推荐答案

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

I mostly agree with @Rob, however you can control state of DataTask initiated by DataTaskPublisher and its progress by using of URLSession methods:

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 { /* ... */ }
        }
    }
}

这篇关于如何检查URLSession.dataTaskPublisher的当前进度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆