ALDownloadManager 基于Alamofire封裝的下載器

ALDownloadManager包含了斷點(diǎn)續(xù)傳,多文件順序下載,多文件同時(shí)下載

同時(shí)下載


2017-12-11 11_50_44.gif

順序下載


2017-12-11 11_49_36.gif

外層調(diào)用:
單文件下載

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

多文件同時(shí)下載

ALDownloadManager.shared.changeDownloadState()

多文件順序下載

 ALDownloadManager.shared.changeWaitState(completeClose: nil)

具體實(shí)現(xiàn):
下載方法(默認(rèn)斷點(diǎn)續(xù)傳)

   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 下載失敗時(shí)的數(shù)據(jù),恢復(fù)下載時(shí)需要用到
downloadRequest 每次下載時(shí)重新賦值,保證downloadRequest為最新值

取消下載

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

Alamofire的取消下載,加上下載狀態(tài)的改變

掛起

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

下載任務(wù)掛起(等待下載): 順序下載時(shí)用到

同時(shí)下載

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

正在下載和已經(jīng)下載完成的任務(wù)保持,其余任務(wù)改變?yōu)橄螺d狀態(tài)

這里重點(diǎn)說(shuō)下順序下載

   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()
           }
   }

如果有任務(wù)下載,下載中的第一個(gè)任務(wù)保持下載狀態(tài),其余改變?yōu)榈却螺d;如果沒(méi)有任務(wù)下載,將所有任務(wù)改變?yōu)榈却螺d,再下載第一個(gè)等待任務(wù),這是我的思路,有更好方法的麻煩告知我

各位路過(guò)的大哥大姐,有星的捧個(gè) 場(chǎng),有錯(cuò)誤的一定要指出,歡迎戳這里 哈哈哈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容