it-swarm.com.de

Wie kann ich eine Aufgabe in NSURLSession finden und abbrechen?

Ich verwende ein NSURLSession-Objekt, um Bilder in meine Anwendung zu laden. Das könnte mehrere Bilder gleichzeitig laden. 

In einigen Augenblicken muss ich das Laden eines bestimmten Bildes abbrechen und das Laden weiterer Bilder fortsetzen. 

Könnten Sie den richtigen Weg vorschlagen?

13

Um eine Aufgabenliste abzurufen, können Sie die NSURLSession-Methode verwenden

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

Ruft asynchron einen Beendigungsrückruf mit allen ausstehenden Daten auf, Aufgaben in einer Sitzung hochladen und herunterladen.

Suchen Sie dann in task.originalRequest.URL nach zurückgegebenen Aufgaben, um die Aufgabe zu finden, die Sie abbrechen möchten.

28
Avt

Hoffe unter Code Hilfe.

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

Swift 3.0 version von @ Avt's antworten, um die Aufgabenliste zu erhalten. Verwenden Sie getTasksWithCompletionHandler .

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

Die zurückgegebenen Arrays enthalten alle Aufgaben, die Sie innerhalb von .__ erstellt haben. Sitzung, die keine Aufgaben enthält, die nach .__ ungültig gemacht wurden. abschließen, fehlschlagen oder abgebrochen werden.

3
pedrouan

Ich schlage zwei Methoden vor:

  1. Fügen Sie die Liste von NSURLSessionTask in ein Array ein. Falls Sie nicht genau wissen, wie viele Bilder Sie erhalten würden? Allerdings müssen Sie den Sitzungsindex kennen, um ihn abzubrechen.
  2. Wenn Sie eine begrenzte Anzahl von Bildern erhalten. Verwenden Sie einfach eine Gruppe von NSURLSessionTask als globale Variablen, damit Sie sie überall in Ihrer Klasse abbrechen können.
1
Nhon Nguyen

Ich denke, du solltest das tun ...

Behalten Sie zunächst Ihre Anforderungen pro Xib im Auge

var download_requests = [NSURLSession]()

Wenn Sie dann eine Anfrage stellen, hängen Sie Ihre Anfrage an Ihr Array an.

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

Dann, wann immer Sie ausstehende Anforderungen stornieren möchten (beispielsweise viewDidDisappear), tun Sie dies

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