I am sending a request which is triggered based on timer. But if I press the back button the request still seems to be active and the response in turns crashes the app. Kindly suggest a way to cancel the request.
Using Xcode 8.2.1 Swift 3
Here is the sample request :
Alamofire.request(path!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: createHeader()).responseJSON {
response in
switch response.result {
case .success(let data):
success(data as AnyObject?)
case .failure(let error) :
failure(error as NSError)
}
}
Even tried invalidating the timer on viewDidDisappear but to no help.
Thanks !!
If you want to cancel the request, you need to trace the requests made and try to cancel it. You can store it in an array and cancel every previous request stored. In your code you create a request: let request = Alamofire.
You can cancel a single request as below:
1 - First get the request:
let request = Alamofire.SessionManager.default.request(path!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: createHeader()).responseJSON { response in
switch response.result {
case .success(let data):
success(data as AnyObject?)
case .failure(let error) :
failure(error as NSError)
}
}
2 - Then, in your viewDidDisappear, just call:
request.cancel()
You can cancel all requests as below:
Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in
sessionDataTask.forEach { $0.cancel() }
uploadData.forEach { $0.cancel() }
downloadData.forEach { $0.cancel() }
}
did you try this solution:
let sessionManager = Alamofire.SessionManager.default
sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
dataTasks.forEach { $0.cancel() }
uploadTasks.forEach { $0.cancel() }
downloadTasks.forEach { $0.cancel() }
}
i also add a check to verify if is this the request that i want to cancel:
dataTasks.forEach
{
if ($0.originalRequest?.url?.absoluteString == url)
{
$0.cancel()
}
}
SWIFT 5
Alamofire.Session.default.session.getTasksWithCompletionHandler({ dataTasks, uploadTasks, downloadTasks in
dataTasks.forEach { $0.cancel() }
uploadTasks.forEach { $0.cancel() }
downloadTasks.forEach { $0.cancel() }
})
How about this:
manager.session.invalidateAndCancel()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With