IOS Alamofire прекращает все запросы
Можно ли, например, сказать:
Alamofire.Manager.cancelAllRequests()
или Alamofire.Manager.sharedInstance.cancelAllRequests()
?
Конечно, было бы здорово, если бы эти запросы, особенно в случае загрузки изображений, были бы приостановлены только позже, когда я укажу тот же URL-адрес, но... Мне нужно, по крайней мере, чтобы отменить все запросы на глобальном уровень. Некоторые предложения?
В моем приложении у меня есть обертка над способом Alamofire.request(.Post....), поэтому я бы очень не хотел, чтобы я не создавал или не взаимодействовал с классом Менеджера иначе, чем указано выше.
Ответы
Ответ 1
Для этого нужно использовать методы NSURLSession
.
Alamofire.Manager.sharedInstance.session.invalidateAndCancel()
Это вызовет всех обработчиков завершения с ошибками отмены. Если вам нужно возобновить загрузку, вам нужно будет захватить resumeData
из запроса, если он доступен. Затем используйте данные возобновления, чтобы возобновить запрос, когда вы будете готовы.
Ответ 2
cnoon
однострочное решение велико, но это делает недействительным NSURLSession, и вам нужно создать новый.
Другим решением будет это (iOS 7 +):
session.getTasks { dataTasks, uploadTasks, downloadTasks in
dataTasks.forEach { $0.cancel() }
uploadTasks.forEach { $0.cancel() }
downloadTasks.forEach { $0.cancel() }
}
Или если вы нацеливаете только iOS 9+:
session.getAllTasks { tasks in
tasks.forEach { $0.cancel() }
}
Ответ 3
Ниже код останавливает запросы в [Swift 3]:
Плюс код работает для Alamofire v3 и v4 плюс для iOS 8 +.
func stopTheDamnRequests(){
if #available(iOS 9.0, *) {
Alamofire.SessionManager.default.session.getAllTasks { (tasks) in
tasks.forEach{ $0.cancel() }
}
} else {
Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in
sessionDataTask.forEach { $0.cancel() }
uploadData.forEach { $0.cancel() }
downloadData.forEach { $0.cancel() }
}
}
}
Просто скопируйте и вставьте функцию.
Ответ 4
в завершении к @Loïs Di Qual вы можете проверить URL-адрес запроса и отменить (приостановить, возобновить) требуемый запрос:
downloadTasks.forEach
{
if ($0.originalRequest?.url?.absoluteString == url)
{
$0.cancel()
}
}
Ответ 5
Если это помогает, я получил ответ cnoon для работы над моим собственным экземпляром Alamofire.Manager
. У меня есть одноэлементный класс под названием NetworkHelper, который имеет свойство alamoFireManager, которое обрабатывает все мои сетевые запросы. Я просто называю NSURSession
invalidateAndCancel()
этим свойством alamoFireManager
, reset моим менеджером в setAFconfig()
, тогда мне хорошо идти.
class NetworkHelper {
private var alamoFireManager : Alamofire.Manager!
class var sharedInstance: NetworkHelper {
struct Static {
static var instance: NetworkHelper?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = NetworkHelper()
}
return Static.instance!
}
init(){
setAFconfig()
}
func setAFconfig(){
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForResource = 4
configuration.timeoutIntervalForRequest = 4
alamoFireManager = Alamofire.Manager(configuration: configuration)
}
func cancelAllRequests() {
print("cancelling NetworkHelper requests")
alamoFireManager.session.invalidateAndCancel()
setAFconfig()
}
Ответ 6
В Swift 2.2
let session = Alamofire.Manager.sharedInstance.session
session.getAllTasksWithCompletionHandler() { tasks in
tasks.forEach { $0.cancel() }
}
Ответ 7
Как остановить Api, вызывающий Alomofire в быстром
class func StopAPICALL() {
let sessionManager = Alamofire.SessionManager.default
sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
dataTasks.forEach { $0.cancel() }
uploadTasks.forEach { $0.cancel() }
downloadTasks.forEach { $0.cancel() }
}
}