如何取消URL会话请求

时间:2017-10-07 07:52:38

标签: ios swift nsurlsession

我使用转换图像将多个图像上传到服务器到base64并在API中将图像作为参数发送。但是当我们一次又一次地调用api然后如何停止api调用按钮点击时。我使用下面的代码来调用API。

提前致谢

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

3 个答案:

答案 0 :(得分:10)

将对象task作为全局变量,然后您可以通过以下方式取消它:

task.cancel()

或者,如果对象sessionURLSession实例,您可以通过以下方式取消它:

session.invalidateAndCancel()

答案 1 :(得分:4)

如果您之前有任何下载正在进行中,如果您不想再次允许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
}

答案 2 :(得分:2)

您可以查看任务结果。如果一切顺利,你可以

  

task.resume()

但如果不是

  

task.cancel()