Отменить запрос 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)
    }
  }
}