2016-08-23 1 views
4

J'ai créé une classe HTTPServiceProvider héritée de AFURLSessionManager. Ajouté ci-dessous le code pour obtenir les données.Annuler toutes les opérations + AFNetworking 3.0

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
let manager = AFURLSessionManager(sessionConfiguration: configuration) 
let dataTask = manager.dataTaskWithRequest(request) { (response, responseObject, error) in 
     //Perform some task 
} 
dataTask.resume() 

Je veux ajouter dataTask à operationQueue fourni par AFURLSesstionManger et annuler toute l'opération dans une autre classe (BaseController.swift) avant d'appeler à nouveau la même demande.

Essayé ce code, mais ne fonctionne pas -

self.operationQueue.addOperationWithBlock{ 
    //Added above code 
} 

Et à l'intérieur fichier BaseController.swift, appelé -

HTTPServiceProvide.sharedInstance.operationQueue.cancelAllOperations 

mais ca marche pas :(

Merci

.
+0

essayer cela dans chaque appel avant 'gestionnaire .operationQueue.cancelAllOperations() ' –

+0

Cela ne fonctionne pas car sans ajouter d'opération à la file, comment annuler l'opération. –

+0

Cela peut ne pas être possible dans ce projet, mais il est recommandé d'utiliser Alamofire au lieu de AFNetworking lorsque vous utilisez Swift. – Fogmeister

Répondre

2

Pour annuler toutes les données avec NSURLSessi sur:

manager.session.getTasksWithCompletionHandler { (dataTasks, uploadTasks, downloadTasks) in 
    dataTasks.forEach { $0.cancel() } 
} 
+0

Faites un commentaire pour votre réponse, s'il vous plaît. – EnriMR

+0

Je veux ajouter dataTask dans 'operationQueue', puis annuler toutes les opérations dans' operationQueue' –

2

Pour moi, la meilleure façon d'annuler toute demande est:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //manager should be instance which you are using across application 
[manager.session invalidateAndCancel]; 

cette approche a un avantage: toutes vos demandes qui exécutent appellera bloc d'échec. Je veux dire celui-ci par exemple:

 [manager GET:url 
     parameters:nil 
      progress:^(NSProgress * _Nonnull downloadProgress) { 
       code 
      } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
       code 
      } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
       //this section will be executed 
      }]; 

2 choses que vous devez savoir:

  • il demande d'annulation effectuée uniquement à cette instance exacte de AFHTTPSessionManager vous utiliserez pour invalidateAndCancel
  • après annulation de tout demandes que vous devez initer une nouvelle instance de AFHTTPSessionManager - lorsque vous avez essayé de faire une demande avec l'ancien, vous obtiendrez l'exception
+0

Je veux ajouter dataTask dans 'operationQueue', puis annuler toutes les opérations dans' operationQueue' –

0

J'ai créé un tableau de les tâches.
var tasks = [URLSessionDataTask]()
alors joint en annexe le dataTask que tout ce que je veux annuler avant de faire une nouvelle demande http
tasks.append(dataTask)

et d'annuler toutes les opérations, je
func cancelPreviousRequest(){ for task in tasks (task as URLSessionTask).cancel() } tasks.removeAll() }