Comment find et annuler une tâche dans NSURLSession?

J'utilise un object NSURLSession pour charger des images dans mon application. Cela pourrait charger plusieurs images simultanément.

Dans certains moments, je dois annuler le chargement d'une image spécifique et continuer à en charger d'autres.

Pourriez-vous suggérer la bonne façon de faire cela?

Pour get la list des tâches, vous pouvez utiliser la méthode de NSURLSession

 - (void)getTasksWithCompletionHandler:(void (^)(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks))completionHandler; 

Appel asynchronous d'un callback de fin avec toutes les tâches en attente, de téléchargement et de téléchargement dans une session.

Vérifiez ensuite task.originalRequest.URL pour les tâches returnnées pour find celle que vous voulez annuler.

J'espère que l'aide de code ci-dessous.

 -(IBAction)cancelUpload:(id)sender { if (_uploadTask.state == NSURLSessionTaskStateRunning) { [_uploadTask cancel]; } } 

Je suggère deux methods:

  1. Placez la list de NSURLSessionTask dans un tableau. Au cas où vous ne savez pas exactement combien d'images vous obtiendriez. Bien que vous deviez connaître l'index de la session afin de l'annuler.
  2. Si vous obtenez un nombre limité d'images. Utilisez simplement un set de NSURLSessionTask comme variables globales afin que vous puissiez y accéder pour l'annuler n'importe où dans votre class.

Version 3.0 rapide de la réponse de @ Avt pour get la list des tâches:

 func getTasksWithCompletionHandler(_ completionHandler: @escaping ([URLSessionDataTask], [URLSessionUploadTask], [URLSessionDownloadTask]) -> Void) { } 

Les arrays renvoyés contiennent toutes les tâches que vous avez créées au cours de la session, à l'exclusion des tâches qui ont été invalidées après l'achèvement, l'échec ou l'annulation.

Je pense que tu devrais faire ça …

Tout d'abord, gardez une trace de vos requests par xib

 var download_requests = [NSURLSession]() 

Ensuite, chaque fois que vous faites une request, ajoutez votre requête à votre tableau comme ceci,

 let s = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) if let url = NSURL(ssortingng: "http://my.url.request.com") { download_requests.append(s) s.dataTaskWithURL(url) { (data, resp, error) -> Void in // .... } } 

Ensuite, chaque fois que vous voulez annuler des requests en attente, (disons sur viewDidDisappear), faites

  override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) //stop all download requests for request in download_requests { request.invalidateAndCancel() } }