iOS,Swift:串行下载多个文件并将所有文件的单个进度条显示为一个进度

Posted

技术标签:

【中文标题】iOS,Swift:串行下载多个文件并将所有文件的单个进度条显示为一个进度【英文标题】:iOS, Swift : Download multiple file serially and showing single progress bar for all file as a one progress 【发布时间】:2020-01-23 07:25:12 【问题描述】:

我正在使用我的 ios(swift4) 应用程序中的 Alamofire 下载 zip 文件。我可以使用 Alamofire 连续下载文件。 但我也想为所有下载的文件显示一个进度条。表示如果我有 4 个 zip 文件,并且当所有文件都下载完毕后,进度应该是 100%。

直到我尝试了下面的代码,它为每个 url 提供了一个进度值,并且进度显示为一个下载的文件,显示进度为 100%,然后再次从 0 开始第二个 url,当第二个 url 下载然后进度显示 100% 完成。

请指导我。当使用 Alamofire 下载所有文件时,我希望将进度值设为 100%。

Alamofire 可以吗?

代码:

func serialZipFileDownload(downloadPath: String)
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let name = self.offlineDownloadFileName?[urlCount]
    let currentVideoURL = documentsURL.appendingPathComponent(name ?? "Default.zip")
    let str = downloadPath
    let urlString = str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
    let url = URL(string: urlString ?? "")

if super.isConnectedToNetwork() == true 
    let manager = Alamofire.SessionManager.default
    let headers = ["Accept-Encoding" : ""]

    manager.request(url ?? "", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).downloadProgress  (progress) in
        print(progress.fractionCompleted)

        DispatchQueue.main.async
            self.progressDownload.setProgress((Float(progress.fractionCompleted)), animated: true)
            let per = round((Float(progress.fractionCompleted)) * 100)
            self.lblDownloadPercent.text = "\(Int(per))%"
        
    .responseData  (response) in
        switch (response.result)
        case .success(_) :
            print(response)
            print(response.result.value!)
            print(response.result.description)

            if let data = response.result.value 
                do 
                    try data.write(to: currentVideoURL)
                    self.showToast(message: "File downloaded successfully")
                
                catch 
                    print("Something went wrong!")
                
            
        case .failure(let error) :
            print(response)
            if error._code == NSURLErrorNetworkConnectionLost 
                DispatchQueue.main.async 
                    super.showPopup(title: msgStruct.networkTitle, message: msgStruct.noInternet)
                
            
            else if error._code == NSURLErrorTimedOut 
                DispatchQueue.main.async 
                    super.showPopup(title: msgStruct.networkTitle, message: msgStruct.noInternet)
                
            
            else if error._code == NSURLErrorDownloadDecodingFailedMidStream 
                print("error",error.localizedDescription)
            
            break
        
    

else
    super.showPopup(title: msgStruct.networkTitle, message: msgStruct.noInternet)

【问题讨论】:

一个建议是将fractionCompleted 除以4,并且不要重置每个文件之间的进度条。如果文件大小变化很大,这并不完全正确,但这是一个简单的解决方案 【参考方案1】:

你可以这样做: 维护一个全局变量 - tatalPercentage 其他一些 swift 类。

  static let tatalPercentage = 0

tatalPercentage = tatalPercentage + Int(per/4)
self.lblDownloadPercent.text = "\(tatalPercentage) %"

【讨论】:

我已经根据从 alamofire 本身获得的分数完成值计算了 per。显示适当的百分比是相互矛盾的。请你能更多地探索它。谢谢 你试过了吗? 感谢您的帮助。我以同样的方式做,它工作正常。 太棒了!享受编码?

以上是关于iOS,Swift:串行下载多个文件并将所有文件的单个进度条显示为一个进度的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSessionDownloadTask - 串行下载多个文件

在 iOS 中使用 NSURLConnection 以串行顺序下载文件

在swift 2中作为一批下载多个文件

当我们尝试在 Python 中使用 pysftp 从 SFTP 串行下载 50 多个文件时,下载失败并显示“身份验证失败”?

使用 Swift 将文件下载到应用程序根目录

swift 录制多个音频 并将音频转换为mp3 并合成多个mp3文件为一个文件