Alamofire:如何按顺序下载文件

Posted

技术标签:

【中文标题】Alamofire:如何按顺序下载文件【英文标题】:Alamofire: How to download files sequentially 【发布时间】:2015-08-24 23:37:25 【问题描述】:

我有一系列要下载的视频文件。我正在使用 for 循环来下载它们中的每一个。但是,当循环运行时,所有文件并行下载,这导致应用程序挂起,UI 冻结,CPU 使用率飙升。

for url in urlArray
  downloadfile(url)

我有一个功能可以下载给定 URL 的文件。

func downloadFile(s3Url:String)->Void 
    Alamofire.download(.GET, s3Url, destination: destination)
         .progress  bytesRead, totalBytesRead, totalBytesExpectedToRead in
             println(totalBytesRead)
         
         .response  request, response, _, error in
             println(response)
         

如何更改此设置以使文件不会同时下载?另外,如何检查下载是否完成,以便更新我的 UI?

【问题讨论】:

@mattt 你能提供一个例子吗?我尝试将 downloadFile 包装在 NSBlockOperation 中,但它没有用。即: let operation = NSBlockOperation () -> Void in println("starting download") self.downloadfile(url!) queue.addOperation(operation) 这应该就是它的全部了。什么不工作? @mattt 它仍然会同时下载它们。我现在放弃了 【参考方案1】:
func downloadFile(var urlArray:[String])->Void
    if let s3Url = urlArray.popLast()
        Alamofire.download(.GET, s3Url, destination: destination)
            .progress  bytesRead, totalBytesRead, totalBytesExpectedToRead in
                println(totalBytesRead)
            
            .response  request, response, _, error in
                downloadFile(urlArray)
                println(response)
        
    

斯威夫特 3.0:

func downloadFile(urlArray:[String])->Void
    var urlArray = urlArray
    if let s3Url = urlArray.popLast()
        Alamofire.download(.GET, s3Url, destination: destination)
            .progress  bytesRead, totalBytesRead, totalBytesExpectedToRead in
                println(totalBytesRead)
            
            .response  request, response, _, error in
                downloadFile(urlArray)
                println(response)
        
    

【讨论】:

一个调用自己的函数让我有点“恐惧”,但它按预期工作。 (做成这样,世界不应该爆炸……) 遗憾的是,var 将在 Swift 3 中被删除。我们如何更改这些代码? 你从哪里听说 var 被删除了? 是否同时将一个控制器切换到另一个控制器,我的意思是在后台说?【参考方案2】:

您可以做的是在文件完成下载时调用另一个函数(即 totalBytesRead >= totalBytesExpectedToRead)。在该函数中,从列表中弹出下一项并使用新 URL 再次调用下载函数。您可以创建一个包含所有 URL 的数组,当您需要一个新项目时,将其从数组中删除并将其传递给下载函数。检查数组是否为空,如果是,则说明您已完成下载所有内容。

你不能只使用循环的原因是 Alamofire 请求总是异步的,所以在发出请求后,控制权立即返回,并且你的程序在下载任何数据之前继续运行。

【讨论】:

【参考方案3】:

我希望这会有所帮助。

var urlArray:[String] =["your file link","your file link"] 

func downloadFile(url: String)->Void

        let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)

        Alamofire.download(
            url,
            method: .get,
            encoding: JSONEncoding.default,
            to: destination).downloadProgress(closure:  (progress) in
                //progress closure

            ).response(completionHandler:  (DefaultDownloadResponse) in
                //here you able to access the DefaultDownloadResponse
                //result closure
                self.urlArray.removeFirst()
                if DefaultDownloadResponse.response?.statusCode == 200 

                    print(DefaultDownloadResponse.destinationURL)

                    if !self.urlArray.isEmpty
                            self.downloadFile(url: self.urlArray[0])
                    
                

            )

【讨论】:

以上是关于Alamofire:如何按顺序下载文件的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 恢复未按预期工作

尝试下载文件时出现 Swift Alamofire 错误

将使用 Alamofire 下载的文件访问到具有未知文件名的下载目录

如何按顺序批量打印PDF\WORD\EXCEL格式的文件 混合打印500多个文件?

这可以用 Alamofire 播放视频文件同步下载吗?

如何使用 Moya 下载文件