остановить urlRequest onViewDisappear - PullRequest
0 голосов
/ 19 февраля 2019

Я загружаю информацию 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()
    }

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вы можете использовать 2 способа

  1. Использование task.cancel ()

  2. Использование task.suspend ()

    task.cancel() выполняет Cancels the task.

    task.suspend() выполняет Temporarily suspends a task.

0 голосов
/ 19 февраля 2019
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().

0 голосов
/ 19 февраля 2019

Сохраните ваши запросы где-нибудь, а затем отойдя от вызова контроллера:

task.cancel()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...