27. Oktober 2019

Daten asynchron von URLs laden mit URLSession

Mit der Klasse URLSession können im Hintergrund Daten von URLs geladen werden. Mit URLSession.shared wird eine anwendungsweit geteilte URLSession verwendet, alternativ können auch eigene URLSession-Objekte erstellt werden, z.B. um unterschiedliche Konfigurationen zu verwenden.

Mit einem dataTask können Daten asynchon im Hintergrund geladen werden. Die Benachrichtigung über den Ladevorgang kann dabei über ein Delegate oder über einen CompletionHandler-Block erfolgen.

Das folgende Beispiel zeigt einen Ladevorgang mit Completion-Handler, der die geladenen Daten übergeben bekommt:

let url = URL(string: "https://www.example.com/")!
let urlSession = URLSession.shared
let task = urlSession.dataTask(with: url) { (data, response, error) in
    
    // Fehlerbehandlung für den Fall, das ein Fehler aufgetreten ist oder data nicht gesetzt ist
    guard let data = data, error == nil else {
        debugPrint("Fehler beim Laden von \(url)", String(describing: error))
        return
    }
    
    // Geladene Daten ausgeben
    debugPrint(String(data: data, encoding: .utf8))
    
}

// Data-Task muss via resume explizit gestartet werden
task.resume()

Hierbei ist darauf zu achten, dass der Aufruf des completionHandler-Blockes auf der Hintergrund-Queue erfolgt, die die Daten heruntergeladen hat. Das heißt eine evt. notwendige Aktualisierung des UIs muss entsprechend wieder auf dem Main-Thread erfolgen, siehe dazu Hintergrundverarbeitung mit OperationQueue .