2017-10-07 131 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()