Отменить запрос Alamofire
Я посылаю запрос, который запускается на основе таймера. Но если я нажму кнопку "Назад", запрос все равно будет активным, и ответ по очереди приведет к сбою приложения. Просьба предложить способ отменить запрос.
Использование Xcode 8.2.1 Swift 3
Вот пример запроса:
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)
}
}
Даже попытался сделать недействительным таймер на viewDidDisappear, но без помощи.
Благодаря !!
Ответы
Ответ 1
Alamofire 4/Swift 3/Xcode 8
Вы можете отменить один запрос, как показано ниже:
1 - Сначала получите запрос:
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 - Затем, в вашем представленииDidDisappear, просто позвоните:
request.cancel()
Вы можете отменить все запросы, как показано ниже:
Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in
sessionDataTask.forEach { $0.cancel() }
uploadData.forEach { $0.cancel() }
downloadData.forEach { $0.cancel() }
}
Ответ 2
вы пробовали это решение:
let sessionManager = Alamofire.SessionManager.default
sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
dataTasks.forEach { $0.cancel() }
uploadTasks.forEach { $0.cancel() }
downloadTasks.forEach { $0.cancel() }
}
Я также добавляю чек, чтобы проверить, является ли это запросом, который я хочу отменить:
dataTasks.forEach
{
if ($0.originalRequest?.url?.absoluteString == url)
{
$0.cancel()
}
}
Ответ 3
Обычно вы, скорее всего, скорее наложите маску на экран (или spinner и т.д.) Во время загрузки, чтобы пользователь ждал завершения загрузки в фоновом режиме.
Но не поможет ли это так просто?
var OnScreen = true // Change this if your view changes
Alamofire.request(path!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: createHeader()).responseJSON {
response in
if (OnScreen){
switch response.result {
case .success(let data):
success(data as AnyObject?)
case .failure(let error) :
failure(error as NSError)
}
}
}