web-dev-qa-db-fra.com

Comment trouver et annuler une tâche dans NSURLSession?

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

Dans quelques instants, 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?

13

Pour obtenir la liste des tâches, vous pouvez utiliser la méthode de NSURLSession

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

Appelle de manière asynchrone un rappel d'achèvement avec toutes les données en attente, télécharger et télécharger des tâches dans une session.

Puis, vérifiez que task.originalRequest.URL contient les tâches renvoyées afin de trouver celle que vous souhaitez annuler.

28
Avt

J'espère que le code aide.

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

Swift 3.0 version de @ Avt réponse pour obtenir la liste des tâches. Utilisez getTasksWithCompletionHandler .

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

Les tableaux renvoyés contiennent toutes les tâches que vous avez créées dans le fichier session, n'incluant pas les tâches qui ont été invalidées après terminer, échouer ou être annulé.

3
pedrouan

Je suggère deux méthodes:

  1. Placez la liste de NSURLSessionTask dans un tableau. Si vous ne savez pas exactement combien d'images vous obtiendrez. Bien que vous deviez connaître l'index de session pour pouvoir l'annuler.
  2. Si vous obtenez un nombre limité d'images. Utilisez simplement un ensemble de NSURLSessionTask comme variables globales pour pouvoir y accéder et l'annuler n'importe où dans votre classe.
1
Nhon Nguyen

Je pense que tu devrais faire ça ...

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

var download_requests = [NSURLSession]()

Ensuite, chaque fois que vous faites une demande, ajoutez votre demande à votre tableau comme suit,

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

Ensuite, chaque fois que vous souhaitez annuler une demande en attente (par exemple, sur viewDidDisappear), ne

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