Подтвердить что ты не робот

IOS Alamofire прекращает все запросы

Можно ли, например, сказать:

Alamofire.Manager.cancelAllRequests() или Alamofire.Manager.sharedInstance.cancelAllRequests()?

Конечно, было бы здорово, если бы эти запросы, особенно в случае загрузки изображений, были бы приостановлены только позже, когда я укажу тот же URL-адрес, но... Мне нужно, по крайней мере, чтобы отменить все запросы на глобальном уровень. Некоторые предложения?

В моем приложении у меня есть обертка над способом Alamofire.request(.Post....), поэтому я бы очень не хотел, чтобы я не создавал или не взаимодействовал с классом Менеджера иначе, чем указано выше.

4b9b3361

Ответ 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() }
        }
    }