Как проверить текущий прогресс URLSession.dataTaskPublisher? - PullRequest
3 голосов
/ 08 апреля 2020

Я использую dataTaskPublisher для извлечения некоторых данных:

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

Если функция вызывается во время выполнения запроса, я хочу вернуть.

В настоящее время Я либо:
1. Установите cancelToken на ноль в раковине, либо
2. Создайте и управляйте переменной isDownloading.

Есть ли встроенный способ проверить, работает ли dataTaskPublisher (и, возможно, его выполнение)?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Относительно получения прогресса от этого издателя, взглянув на исходный код , мы можем видеть, что он просто выполняет задачу обработки данных на основе блоков завершения (то есть dataTask(with:completionHandler:)). Но полученный URLSessionTask является частной собственностью частного Subscription, используемого DataTaskPublisher. В итоге, этот издатель не предоставляет какого-либо механизма для отслеживания хода выполнения основной задачи.

Как указал Денис, вы можете запросить у URLSession информацию о его задачах.

2 голосов
/ 08 апреля 2020

Я в основном согласен с @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 { /* ... */ }
        }
    }
}
...