2014-05-07 11 views
12

Sto utilizzando un oggetto NSURLSession per caricare immagini nella mia applicazione. Questo potrebbe caricare più immagini contemporaneamente.Come trovare e cancellare un'attività in NSURLSession?

In alcuni momenti ho bisogno di cancellare il caricamento di un'immagine specifica e continuare a caricarne altri.

Puoi suggerire il modo corretto per farlo?

+0

Bene, c'è l'API 'NSURLSessionTask', trova ciò che vuoi cancellare e chiama' cancel' su di esso. – esh

+0

Corretto, è 'NSURLSesstionTask' ed è facile inviarlo metodo' cancel'. Ma il problema è trovare un compito specifico. In questo caso ho bisogno di elencare tutti i compiti della sessione corrente e trovare l'attività di cui ho bisogno per descrizione, per esempio. Quindi, ho bisogno di un modo per elencare le attività nella sessione. –

risposta

1

suggerisco due metodi:

  1. disporre l'elenco dei NSURLSessionTask in un array. Nel caso in cui non sai esattamente quante immagini otterresti. Anche se devi conoscere l'indice di sessione per cancellarlo.
  2. Se si ottiene un numero limitato di immagini. Basta usare un set di NSURLSessionTask come variabili globali in modo da poter accedere per cancellarlo ovunque nella classe. Lista
+1

Grazie per la tua risposta, ma credo che siano modi un po 'maleducati. Entrambi funzioneranno ma entrambi hanno problemi di progettazione del software come l'utilizzo di variabili globali e la duplicazione. È possibile utilizzarli se non esiste un modo corretto. –

26

Per ottenere attività che è possibile utilizzare il metodo di NSURLSession

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

chiamate in modo asincrono un callback di completamento con tutti i dati in sospeso, caricare, e le attività di download in una sessione.

Quindi controllare task.originalRequest.URL per le attività restituite per trovare quello che si desidera annullare.

+0

È possibile esaminare la sezione "Ottenere informazioni generali sulle attività" in [questo] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionTask_class/Reference/Reference.html#//apple_ref/doc/uid/TP40013436-CH1-SW14). Quindi identifica la tua richiesta attraverso questi mezzi e annulla l'attività nel blocco incluso in questo metodo. – esh

+0

È strano, su Xcode 6 e iOS 8 e Swift, ottengo un "selettore non riconosciuto" quando chiamo invalidateAndCancel() su un oggetto dataTask. –

+1

@VanDuTran È necessario utilizzare il metodo 'cancel' https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionTask_class/index.html#//apple_ref/occ/instm/NSURLSessionTask/cancel – Avt

4

Speranza sotto l'aiuto del codice.

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

penso che si dovrebbe fare questo ...

In primo luogo, tenere traccia delle vostre richieste al XI ter

var download_requests = [NSURLSession]() 

Poi, ogni volta che si effettua una richiesta, aggiungere la richiesta per l'array così,

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 
    // .... 
    } 
} 

Poi ogni volta che si desidera annullare qualsiasi richiesta in sospeso, (diciamo su viewDidDis apparire), fare

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

You don Ho bisogno di salvare le sessioni, guarda la risposta di @ pedrouan – Jimbo

2

Swift versione 3.0 di @ risposta di Avt per ottenere l'elenco delle attività. Utilizzare getTasksWithCompletionHandler.

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

Gli array restituiti contengono qualsiasi attività che si è creato all'interno della sessione , ad esclusione di tutti i compiti che sono stati invalidata dopo completato, in mancanza, o di essere annullato.

+0

Ho svitato questo, quindi spero che vada in cima, poiché è corretto farlo senza tenere un elenco manuale da solo. – Jimbo

-1

Si può semplicemente memorizzare gli URL che avete iniziato a scaricare i dataTasks in modo che quando si vuole annullare una delle richieste, ottenere l'URLSessionDataTask scaricando con il seguente codice:

getVideoFromUrl = session.dataTask(with: "Your URL Here") 
getVideoFromUrl?.cancel() 

e annullare l'URLSessionDataTask così :)

Problemi correlati