URLSession downloadTask (с :) создает несколько загрузок файлов - PullRequest
0 голосов
/ 31 марта 2020

Справочная информация: у меня есть страница, где пользователи могут go загружать различные файлы карт. В настоящее время у меня есть настройка решения, но у него есть некоторые проблемы. Вот что у меня есть:

public class FileDownloader: NSObject, URLSessionDownloadDelegate {
    public let identifier: String
    public let progress = CurrentValueSubject<Float, Never>(0)
    public let handleFinish: (URL) -> Void
    public let handleError: (Error?) -> Void

    public init(identifier: String, handleFinish: @escaping (URL) -> Void, handleError: @escaping (Error?) -> Void) {
        self.identifier = identifier
        self.handleFinish = handleFinish
        self.handleError = handleError
    }

    lazy var urlSession: URLSession = {
        let config = URLSessionConfiguration.background(withIdentifier: self.identifier)
        config.sessionSendsLaunchEvents = true
        let queue = OperationQueue()
        return URLSession(configuration: config, delegate: self, delegateQueue: queue)
    }()

    func startDownload(url: URL) {
        let backgroundTask = urlSession.downloadTask(with: url)
        backgroundTask.resume()
    }

    public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
        self.handleError(error)
    }

    public func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        self.handleFinish(location)
    }

    public func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
        let percentage = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)

        self.progress.send(percentage)
    }
}

По сути, я создаю новый FileDownloader для каждого файла строки. Проблемы заключаются в следующем:

  1. На симуляторе я запускаю загрузку и немного ее запускаю, затем я останавливаю приложение. Когда я запускаю его снова и пытаюсь загрузить файл еще раз, он начинает загружать 2 одинаковых файла и обновляет меня с прогрессом обоих.

  2. Я не уверен, как получить текущий прогресс, когда я go ухожу со страницы загрузки и затем возвращаюсь.

Похоже, что если бы я мог получить текущее задание, то я мог бы использовать это. Можно ли запросить у системы текущую загрузку и начать получать обновления прогресса? Неужели я отошел от своей реализации и мне нужно внести изменения, чтобы делать то, что я хочу?

...