web-dev-qa-db-fra.com

iOS Alamofire arrête toutes les demandes

Existe-t-il un moyen de dire par exemple:

Alamofire.Manager.cancelAllRequests() ou Alamofire.Manager.sharedInstance.cancelAllRequests()?

Bien sûr, ce serait bien si ces demandes, en particulier en cas de téléchargement d'images, ne devaient être suspendues que plus tard lorsque j'appellerais la même URL, mais ... J'ai au moins besoin d'annuler toutes les demandes au niveau mondial. Quelques suggestions ?

Dans mon application, j'ai un wrapper au-dessus de la façon de faire les choses Alamofire.request (.Post ....), donc j'apprécierais vraiment de ne pas me faire créer ou interagir avec la classe Manager d'une autre manière que celle spécifiée ci-dessus.

19
Fawkes

Vous devez utiliser les méthodes NSURLSession directement pour accomplir cela.

Alamofire.Manager.sharedInstance.session.invalidateAndCancel()

Cela appellera tous vos gestionnaires d'achèvement avec des erreurs d'annulation. Si vous devez pouvoir reprendre les téléchargements, vous devrez récupérer le resumeData de la demande s'il est disponible. Utilisez ensuite les données de reprise pour reprendre la demande en place lorsque vous êtes prêt.

17
cnoon

La solution à une ligne de cnoon est excellente, mais elle invalide la session NSURL et vous devez en créer une nouvelle.

Une autre solution serait la suivante (iOS 7+):

session.getTasks { dataTasks, uploadTasks, downloadTasks in
    dataTasks.forEach { $0.cancel() }
    uploadTasks.forEach { $0.cancel() }
    downloadTasks.forEach { $0.cancel() }
}

Ou si vous ciblez uniquement iOS 9+:

session.getAllTasks { tasks in
    tasks.forEach { $0.cancel() }
}
62
ldiqual

Ci-dessous, le code arrête les demandes dans [Swift 3]:

De plus, le code fonctionne pour Alamofire v3 & v4 plus pour 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() }
        }
    }
}

Copiez et collez simplement la fonction.

9
Yash Bedi

en complément du @ Loïs Di Qual vous pouvez vérifier l'url de la demande et annuler (suspendre, reprendre) la demande dont vous avez besoin:

downloadTasks.forEach
            {
                if ($0.originalRequest?.url?.absoluteString == url)
                {
                    $0.cancel()
                }
            }
2

Si cela aide, j'ai obtenu la réponse de cnoon pour travailler sur ma propre instance d'un Alamofire.Manager. J'ai une classe singleton appelée NetworkHelper qui a une propriété appelée alamoFireManager, qui gère toutes mes requêtes réseau. J'appelle simplement la NSURSessioninvalidateAndCancel() sur cette propriété alamoFireManager, réinitialise mon gestionnaire dans setAFconfig(), puis je suis prêt à partir.

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()
}
1
iantheparker

Dans Swift 2.2

let session = Alamofire.Manager.sharedInstance.session
session.getAllTasksWithCompletionHandler() { tasks in
    tasks.forEach { $0.cancel() }
}
1
Diego Carrera

Dans Alamofire5, vous pouvez utiliser:

    /// cancel all request in APIManager session
    /// - Parameter completion: Closure to be called when all `Request`s have been cancelled.
    func cancelAllRequest(completion: (() -> Void)? = nil) {
        self.session.cancelAllRequests(completion: completion)
    }
0
Heaven

Comment arrêter l'Api appelant Alamofire dans Swift

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() } } }

0
Praveen Reddy