ALDownloadManager 基于Alamofire封装的下载器

ALDownloadManager包含了断点续传,多文件顺序下载,多文件同时下载

同时下载

ALDownloadManager 基于Alamofire封装的下载器顺序下载ALDownloadManager 基于Alamofire封装的下载器

外层调用:单文件下载

ALDownloadManager.shared.download(url: self.testUrl)?.downloadProgress(nil).downloadResponse(nil)

多文件同时下载

ALDownloadManager.shared.changeDownloadState()

多文件顺序下载

ALDownloadManager.shared.changeWaitState(completeClose: nil)

具体实现:下载方法(默认断点续传)

func download() {
       if let resumeData = cancelledData {
           let destination = createDestination(destinationPath: destinationPath)
           downloadRequest = manager?.download(resumingWith: resumeData, to: destination).response(completionHandler: { [weak self] (defresponse) in
               self?.cancelledData = defresponse.resumeData
           }).downloadProgress(closure: { (progress) in
               self.progress = progress
           }).response(completionHandler: { (defaultResponse) in
               self.respons = defaultResponse
           })
       }else{
           let destination = createDestination(destinationPath: destinationPath)
           if let url = downloadurl {
               downloadRequest = manager?.download(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil, to: destination).response(completionHandler: { [weak self] (defresponse) in
                   self?.cancelledData = defresponse.resumeData
               }).downloadProgress(closure: { (progress) in
                   self.progress = progress
               }).response(completionHandler: { (defaultResponse) in
                   self.respons = defaultResponse
               })
           }
       }
       self.state = ALDownloadState.Download
   }

cancelledData 下载失败时的数据,恢复下载时需要用到downloadRequest 每次下载时重新赋值,保证downloadRequest为最新值

取消下载

func cancel() {
       downloadRequest?.cancel()
       self.state = ALDownloadState.Cancel
   }

Alamofire的取消下载,加上下载状态的改变

挂起

func hangup() {
       downloadRequest?.cancel()
       self.state = ALDownloadState.Wait
   }

下载任务挂起(等待下载): 顺序下载时用到

同时下载

func changeDownloadState() {
       self.downloadInfoArray = self.downloadInfoArray?.map({ (info) -> ALDownloadInfo in
           if  info.state == ALDownloadState.Download || info.state == ALDownloadState.Completed{}
           else{
               info.download()
           }
           return info
       })
   }

正在下载和已经下载完成的任务保持,其余任务改变为下载状态

这里重点说下顺序下载

func changeWaitState(completeClose: ALDownloadCompleteClose?) {
       self.completeClose = completeClose
           var isDownloadFirst = false
           self.downloadInfoArray = self.downloadInfoArray?.map({ (info) -> ALDownloadInfo in
               if isDownloadFirst == false {
                   if info.state == ALDownloadState.Download {
                   isDownloadFirst = true
                       return info
                   }
               }
               if info.state == ALDownloadState.Completed {}
               else{
                   info.hangup()
               }
               return info
           })
           if isDownloadFirst == false {
                  resumeFirstWillResume()
           }
   }

如果有任务下载,下载中的第一个任务保持下载状态,其余改变为等待下载;如果没有任务下载,将所有任务改变为等待下载,再下载第一个等待任务,这是我的思路,有更好方法的麻烦告知我

就想要

相关推荐