Дождитесь окончания URLSession до 1000 * в пакете Swift - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь загрузить файл, используя URLSession в пакете Swift. Это мой код:

public class Downloader: NSObject, URLSessionDownloadDelegate {
    private lazy var session = URLSession(configuration: .default,
                                          delegate: self,
                                          delegateQueue: nil)
    var semaphore: DispatchSemaphore?

    public func download(fileAt url: URL) {
        semaphore = DispatchSemaphore(value: 1)
        session.downloadTask(with: url).resume()
        semaphore!.wait()
    }

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

    public func urlSession(_ session: URLSession,
                downloadTask: URLSessionDownloadTask,
                didFinishDownloadingTo location: URL) {
        print(location)
        semaphore?.signal()
    }

}

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

Если кто-то может помочь, это было бы здорово.

1 Ответ

0 голосов
/ 23 января 2020

Это можно сделать, добавив semaphore как свойство к себе. Должно быть указано в didCompleteWithError и didFinishDownloadingTo.

...