【问题标题】:urlsession how to determine when all files are downloadedurlsession如何确定何时下载所有文件
【发布时间】:2019-02-12 07:07:37
【问题描述】:

我正在使用 urlsession 从服务器下载一些文件,每次下载后都会触发委托“didFinishDownloadingTo”。但我想要在所有下载完成后触发的东西。

我必须使用委托“didCompleteWithError”吗?

我如何知道是否所有文件都已下载?

func downloadPdf() {

    for k in self.resultAddressServer {


            let fileURL = URL(string: k)
            let sessionConfig = URLSessionConfiguration.default
            let operationQueue = OperationQueue()
            let urlSession = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: operationQueue)
            let request = URLRequest(url:fileURL!)
            let downloadTask = urlSession.downloadTask(with: request)

            downloadTask.resume()
    }
}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {

    do {
        let manager = FileManager.default
        let destinationURL = try manager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
            .appendingPathComponent(downloadTask.originalRequest!.url!.lastPathComponent)
        try? manager.removeItem(at: destinationURL)
        try manager.moveItem(at: location, to: destinationURL)
        print(destinationURL)
    } catch {
        print(error)
    }

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    if error != nil {
        DispatchQueue.main.async() {
            self.statusLabel.text = "Download failed"
        }
} else {
        DispatchQueue.main.async() {
            self.statusLabel.text = "Download finished"

        }
}

【问题讨论】:

标签: ios nsurlsessiondownloadtask urlsession


【解决方案1】:

根据其他帖子的建议,我添加了一个数组,在其中添加了 downloadTask 标识符号,然后在任务完成时在委托中删除该标识符 #。最后要知道是否所有的下载都完成了,我只检查array.count什么时候等于0。

func downloadPdf() {

    for k in self.resultAddressServer {


            let fileURL = URL(string: k)
            let sessionConfig = URLSessionConfiguration.background(withIdentifier: "com.Test")
            let urlSession = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: OperationQueue())
            let request = URLRequest(url:fileURL!)
            let downloadTask = urlSession.downloadTask(with: request)
            self.tasksArray.append(downloadTask.taskIdentifier)
            print(downloadTask.taskIdentifier)
            downloadTask.resume()
    }



func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {

    do {
        let manager = FileManager.default
        let destinationURL = try manager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
            .appendingPathComponent(downloadTask.originalRequest!.url!.lastPathComponent)
        try? manager.removeItem(at: destinationURL)
        try manager.moveItem(at: location, to: destinationURL)
        print(destinationURL)
    } catch {
        print(error)
    }

    if let index = self.tasksArray.index(of: downloadTask.taskIdentifier) {
        self.tasksArray.remove(at: index)
        print(self.tasksArray.count)
    }

    DispatchQueue.main.async() {

        if self.tasksArray.count == 0 {

            //Do whatever you want, all downloads are completed
            //the DispatchQueue is for what I use this for...maybe not needed in you case
        }


    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2021-08-16
    相关资源
    最近更新 更多