Einstieg in Swift Concurrency – Teil 2

Task.sleep

Im ersten Teil dieser Artikelreihe haben wir den grundlegenden Einsatz der beiden neuen Swift-Schlüsselwörter async und await kennengelernt. Ergänzend möchte ich in diesem Beitrag ein konkretes Beispiel zeigen, das den Einsatz von Concurrency in Swift demonstriert.

Grundlage für dieses Beispiel ist eine praktische Funktion namens Task.sleep(_:). Sie ist ideal, um die korrekte Funktionalität von asynchronem Code zu testen. Sie pausiert die Ausführung der nachfolgenden Befehle für den Zeitraum, den man als Parameter übergibt. Diesen Zeitraum definiert man hierbei in Nanosekunden. Soll die Ausführung also beispielsweise für zwei Sekunden angehalten werden, ruft man den folgenden Befehl auf:

await Task.sleep(2 * 1_000_000_000)

Die im nachfolgenden Listing definierte View nutzt dieses Verhalten, um das asynchrone Laden von Bildern zu simulieren (siehe die Methode loadImages()). Die Methode wird beim Laden der View mittels Task-Modifier aufgerufen. Die View zeigt zunächst eine ProgressView an, die durch eine Liste mit Bildern ersetzt wird, sobald diese via loadImages() erfolgreich „geladen“ wurden.

struct ContentView: View {
    @State private var photos = [String]()
    
    var body: some View {
        photosList
            .task {
                photos.append(contentsOf: await loadImages())
            }
    }
    
    @ViewBuilder private var photosList: some View {
        if photos.isEmpty {
            ProgressView("Loading photos ...")
        } else {
            List {
                ForEach(photos, id: \.self) { photo in
                    Image(photo)
                        .resizable()
                        .scaledToFit()
                }
            }
        }
    }
    
    private func loadImages() async -> [String] {
        await Task.sleep(5 * 1_000_000_000)
        return ["Cockatiel01", "Cockatiel02", "Cockatiel03"]
    }
}
Via Task.sleep(_:) simuliere ich den "Download" der anzuzeigenden Bilder.
Via Task.sleep(_:) simuliere ich den „Download“ der anzuzeigenden Bilder.

Um das Beispiel selbst lokal nachvollziehen zu können, bräuchte es natürlich passende Bilder in dem zugehörigen Projekt. In meinem Fall lagen die drei Bilder („Cockatiel01“, „Cockatiel02“ und „Cockatiel03“) in einem Asset Catalog vor.

Gerne könnt ihr aber auch direkt auf mein vollständiges Beispielprojekt zurückgreifen und es mit meinen vorgegebenen Bildern testen. Ihr findet es auf GitHub über die folgende URL:

https://github.com/Sillivan88/TS-Concurrency

Euer Thomas


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert