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?
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.
J'espère que le code aide.
-(IBAction)cancelUpload:(id)sender {
if (_uploadTask.state == NSURLSessionTaskStateRunning) {
[_uploadTask cancel];
}
}
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é.
Je suggère deux méthodes:
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.NSURLSessionTask
comme variables globales pour pouvoir y accéder et l'annuler n'importe où dans votre classe.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()
}
}