2016-11-04 65 views
0

我有通過Alamofire要求用base64上傳一個字符串到服務器的功能,希望用戶能夠取消上傳。取消Alamofire.request不工作​​(SWIFT)

我目前正在與.cancel()努力,但我想我錯誤地接近這一方法,因爲它不會取消的請求。

代碼:

var uploadVerificateRequest: Alamofire.Request? 

func uploadVerificate(_ pdf: Data, completionHandler: @escaping (_ result: [String: AnyObject]) ->()) { 
    var jsonData: [String: AnyObject]? 

    let PDFBase64 = pdf.base64EncodedString() 

    let verificateParameters = [ 
     "Base64Image": PDFBase64 
    ] as [String : Any] 

    self.uploadVerificateRequest = Alamofire.request(URL, method: .post, parameters: verificateParameters) 
     .responseJSON { (response) -> Void in 

      if let value = response.result.value { 
       let json = value as! [String: AnyObject] 

       jsonData = json 

       if let jsonData = jsonData { 
        completionHandler(jsonData) 
       } 
       else { 
        completionHandler([:]) 
       } 
      } 
    } 
} 

func cancelUploadVerificate() { 
    self.uploadVerificateRequest?.cancel() 
} 

有什麼建議?

+0

另一件事,在調用cancel()後打印self.uploadVerificateRequest.task時,我收到「<__ NSCFLocalDataTask:0x7fcdcee1d2b0> {task標識符:8} {取消}「,所以cancel()調用本身似乎工作,但請求仍然繼續運行。 – drante

回答

0

呼叫取消任務:

self.uploadVerificateRequest?.task?.cancel() 
+0

不幸的是,這並沒有奏效。我也嘗試過使用self.uploadVerificateRequest?.task?.suspend(),但它仍然繼續運行。 – drante

+0

另外,var uploadVerificateRequest在數據上傳完成後總是爲零。這是正常的嗎? – drante

0

我想你應該嘗試這樣的事:

self.uploadVerificateRequest = Alamofire.request(URL, method: .post, parameters: verificateParameters) 
self.uploadVerificateRequest.responseJSON { (response) -> Void in 

     if let value = response.result.value { 
      let json = value as! [String: AnyObject] 

      jsonData = json 

      if let jsonData = jsonData { 
       completionHandler(jsonData) 
      } 
      else { 
       completionHandler([:]) 
      } 
     } 
} 
+0

當我嘗試這個時,我收到錯誤「價值的類型'請求?沒有會員'responseJSON'「。在函數之外,我仍然使用var uploadVerificateRequest:Alamofire.Request ?. :/ – drante

1

發現這似乎一些測試後,開始工作的解決方案:

func cancelUploadVerificate() { 
    self.uploadVerificateRequest.session.getAllTasks { tasks in 
     tasks.forEach { $0.cancel() } 
    } 
} 
+0

你是如何測試這個的?我有類似的代碼,但在一個單例共享實例。 – markhorrocks