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.
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.
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() }
}
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.
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()
}
}
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 NSURSession
invalidateAndCancel()
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()
}
Dans Swift 2.2
let session = Alamofire.Manager.sharedInstance.session
session.getAllTasksWithCompletionHandler() { tasks in
tasks.forEach { $0.cancel() }
}
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)
}
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() }
}
}