How to cancel on-going HTTP request in Swift?

Joon. P picture Joon. P · Jul 10, 2015 · Viewed 11.7k times · Source

My code does GET request like this:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
    // ...

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
        if error != nil {
            println("error = \(error)")
            return
        }

        if let HTTPresponse = response as? NSHTTPURLResponse {
            if HTTPresponse.statusCode == 200 { // Successfully got response
                var err: NSError?
                if let json = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &err) as? [String : AnyObject] {
                    // Success decoding JSON
                } else {
                    // Failed -> stop activity indicator
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        self.activityIndicator.stopAnimating()
                    })
                }
            }
            task.resume()
        })
    }
}

If viewWillDisappear() gets called before the request finishes, I want to stop the request.

Right now, it seems like the view doesn't disappear before the request finishes. Is there a way to cancel the ongoing GET/POST request?

Answer

Michal picture Michal · Jul 10, 2015

Yes, but you have to store it for outside access - the task has a method cancel() which you can use, just like you're using resume().

For viewDidDisappear() I'd recommend having it as object property - var currentTask: NSURLSessionTask?, in your dispatch you would have self.currentTask = ... instead of let task = ... and in your viewDidDisappear() you would call self.currentTask?.cancel().