取消一个带有特定 url 的 Alamofire 下载请求

Posted

技术标签:

【中文标题】取消一个带有特定 url 的 Alamofire 下载请求【英文标题】:cancel one Alamofire download request with a specific url 【发布时间】:2017-12-24 06:51:18 【问题描述】:

我有一个表格视图,可以为每个单元格下载视频文件。这是我下载视频文件的代码。

 func beginItemDownload(id:String,url:String,selectRow:Int) 

    let pathComponent = "pack\(self.packID)-\(selectRow + 1).mp4"

    let destination: DownloadRequest.DownloadFileDestination =  _, _ in
      let directoryURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
      let folderPath: URL = directoryURL.appendingPathComponent("Downloads", isDirectory: true)
      let fileURL: URL = folderPath.appendingPathComponent(pathComponent)
      return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
    
    let url = URL(string:url)

    Alamofire.download(
      url!,
      method: .get,
      parameters: nil,
      encoding: JSONEncoding.default,
      headers: nil,
      to: destination).downloadProgress(closure:  (progress) in
        DispatchQueue.main.async 

          if progress.fractionCompleted < 1 

             print(Float(progress.fractionCompleted))

          

          if progress.fractionCompleted == 1 
            print("Completed")
          
        

      ).response(completionHandler:  (defaultDownloadResponse) in

        if let destinationUrl = defaultDownloadResponse.destinationURL  
          DispatchQueue.main.async 

                    print("destination url -****",destinationUrl.absoluteString)

          
        
        if let error = defaultDownloadResponse.error 
          debugPrint("Download Failed with error - \(error)")         
          return
        
      )
  

点击每个表格视图单元格的下载按钮时,我可以下载视频文件并为每个单元格分配进度值。但是现在我想在点击每个单元格中的取消按钮时取消此单元格的下载请求,. 我为此问题搜索了不同的解决方案,但我找不到任何解决方案来取消具有特定 url 字符串的一个请求。怎么能解决这个问题。 谢谢大家的回复。

【问题讨论】:

【参考方案1】:

未经测试但应该可以使用,使用originalRequest(这是创建任务时的原始请求)或可选的currentRequest(这是当前正在处理的请求)来定位您要取消的特定任务:

func cancelSpecificTask(byUrl url:URL) 
    Alamofire.SessionManager.default.session.getAllTaskssessionTasks in
        for task in sessionTasks 
            if task.originalRequest?.url == url 
                task.cancel()
            
        

    

或者只取消下载任务:

func cancelSepcificDownloadTask(byUrl url:URL) 
    let sessionManager = Alamofire.SessionManager.default 
    sessionManager.session.getTasksWithCompletionHandler  dataTasks, uploadTasks, downloadTasks in 
    for task in downloadTasks 
            if task.originalRequest?.url == url 
            task.cancel()
        
    

【讨论】:

所有请求的请求 url 相同,参数不同!是用参数或任何其他方式检查请求的任何方式【参考方案2】:

虽然luiyezheng's answer 非常好并且应该可以完成这项工作,但开发人员(例如我)有时会忽略Alamofire.download() 实际上会返回DownloadRequest,如果需要可以将其存储在某个地方,然后再存储cancel()`ed :

let request = Alamofire.download("http://test.com/file.png")
r.cancel()

【讨论】:

以上是关于取消一个带有特定 url 的 Alamofire 下载请求的主要内容,如果未能解决你的问题,请参考以下文章

取消对 Alamofire 图像的请求

带有 Swift 3 的 Alamofire 4.3,POST 请求不适用于 URL 参数

在 iOS 9 问题上使用 Alamofire 上传带有 URL 参数的图像

带有 åäö(特殊字符)的 Alamofire GET 请求,无效 url

alamofire:带有标头的 POST 请求

发送带有参数的 Alamofire 请求以及 HTTP 正文中的图像