停止urlRequest onViewDisappear

问题描述 投票:0回答:3

我从我的服务器加载我的json信息,如下所示,但是当我太快点击一个不同的页面时,请求会在后台继续尝试,并且有一个警告说找不到viewController。如何取消对ViewDisappear的所有请求?

if let requestURL = URL(string: "https://www.example.com/file.php") {

        var urlRequest = URLRequest(url: requestURL)
        urlRequest.httpMethod = "POST"
        let postString = "email=\(loginUsername.text!)"
        urlRequest.httpBody = postString.data(using: .utf8)

        let session = URLSession.shared
        let task = session.dataTask(with: urlRequest as URLRequest) {  (data, response, error) in

            if let data = data {
                do {
                    if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any] {

                        // Async Stuff
                        DispatchQueue.main.async{

                            // do things
                        }

                        DispatchQueue.main.async(execute: {
                        })
                    }
                } catch {
                    print("Error: \(error)")
                }
            }
        }
        task.resume()
    }
swift
3个回答
1
投票

在某处保存您的请求,然后远离控制器调用:

task.cancel()

0
投票

你可以使用2种方式

  1. 使用task.cancel()
  2. 使用task.suspend() task.cancel()正在做Cancels the task. task.suspend()正在做Temporarily suspends a task.

0
投票
class DataCall {
    var task: URLSessionDataTask?

    func load() {
        guard let requestURL = URL(string: "https://www.example.com/file.php") else { return }

        var urlRequest = URLRequest(url: requestURL)
        urlRequest.httpMethod = "POST"
        let postString = "email=\(loginUsername.text!)"
        urlRequest.httpBody = postString.data(using: .utf8)

        let session = URLSession.shared
        task = session.dataTask(with: urlRequest as URLRequest) {  (data, response, error) in

            if let data = data {
                do {
                    if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any] {

                        // Async Stuff
                        DispatchQueue.main.async{

                            // do things
                        }
                    }
                } catch {
                    print("Error: \(error)")
                }
            }
        }
        task.resume()
    }

    func stopTask() {
        task.cancel()
    }
}

然后在你的viewWillDissapear你打电话给dataCall.stopTask()

© www.soinside.com 2019 - 2024. All rights reserved.