【问题标题】:How to cancel a URL session request如何取消 URL 会话请求
【发布时间】:2017-10-07 16:39:38
【问题描述】:

我正在使用将图像转换为 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()

【问题讨论】:

标签: ios swift nsurlsession


【解决方案1】:

将对象task设为全局变量,然后你可以在任何地方取消它:

task.cancel()

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

session.invalidateAndCancel()

【讨论】:

    【解决方案2】:

    如果您不想再次允许 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
    }
    

    【讨论】:

      【解决方案3】:

      您可以检查任务的结果。如果一切都好,你可以

      task.resume()

      如果不是

      task.cancel()

      【讨论】:

        猜你喜欢
        • 2014-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        相关资源
        最近更新 更多