2017-10-07 134 views
0

我將多個圖像上傳到服務器,使用將圖像轉換爲base64並將圖像作爲參數在API中發送。但是當我們一次又一次地調用api時,如何停止api調用按鈕單擊。我使用下面的代碼來調用API。如何取消URL會話請求

在此先感謝

let urlPath: String = "URL" 
     let url: URL = URL(string: urlPath)! 
     var request1 = URLRequest(url: url) 
     request1.httpMethod = "POST" 
     let stringPost="imgSrc=\(image)" 
     let data = stringPost.data(using: String.Encoding.utf8) 
     // print("data\(data)") 
     request1.httpBody=data 

     request1.timeoutInterval = 60 
     let _:OperationQueue = OperationQueue() 
     let task = session.dataTask(with: request1){data, response, err in 
      do 
      { 
       if data != nil 
       { 
        print("data\(String(describing: data))") 
        if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary 
        { 
         DispatchQueue.main.async 
          { 
         print("json\(jsonResult)") 


        } 
       } 

      } 
      catch let error as NSError 
      { 
       DispatchQueue.main.async 
        { 

       print("error is \(error)") 
       print("error desc \(error.localizedDescription)") 
       } 
      }} 
     task.resume() 
+0

的可能的複製[NSURLSession取消任務](https://stackoverflow.com/questions/19975642/nsurlsession-cancel-task) –

+0

重複的可能性https://stackoverflow.com/questions/23518690/how-to-find-and-c安塞爾 - 一個任務功能於nsurlsession –

回答

4

使對象task作爲一個全局變量,那麼你可以在任何地方取消:

task.cancel() 

或者,如果對象sessionURLSession例如,您可以取消它:

session.invalidateAndCancel() 
1

如果您不想再次允許API調用,如果有任何先前的下載正在進行中,您可以執行如下操作,

將您的任務(URLSessionDataTask類型)變量作爲全局變量,如下所示,

let task = URLSessionDataTask() 

然後在您的按鈕動作做如下的檢查任務下載狀態,

func uploadButtonPressed() { 
    if task.state != .running { 
     // Make your API call here 
    } else { 
     // Dont perform API call 
    } 
} 

您可以使用以下類似的運行是由URLSessionDataTask類提供相應的和做動作按狀態的需要,

public enum State : Int { 
    case running 
    case suspended 
    case canceling 
    case completed 
} 
1

您可以檢查任務的結果。如果一切正常,你可以

task.resume()

,但如果沒有

task.cancel()