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.
Weitere Informationen
-
Tutorial: JSON-Daten laden und in einem UITableView anzeigenTutorial und Beispielprojekt zum Laden von Daten via URLSession und JSONDecoder.
-
URL Loading SystemBeschreibung der URLSession.
-
Encoding HTTP GET parametersBeispielsnippet zum Kodieren von HTTP-GET-Parametern.
-
Downloading files in background with URLSessionDownloadTaskMit URLSessionDownloadTask und URLSessionUploadTask können Downloads oder Uploads erfolgen, die außerhalb des App-Prozesses laufen und daher auch nach dem Beenden der App im Hintergrund fertiggestellt werden können.