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