Einstieg in Swift Concurrency – Teil 3

async let

Bei async let handelt es sich um eine neue Syntax in Swift 5.5. Sie ermöglicht es, Aktionen parallel ablaufen zu lassen. Die Funktion, die einen oder mehrerer solcher async let-Tasks erzeugt, führt alle nachfolgenden Befehle unmittelbar aus. Erst, wenn das Ergebnis einer async let-Operation tatsächlich benötigt wird, wartet die Funktion auf jenes Ergebnis.

Um den Einsatz von async let zu erläutern, dient das nachfolgende Listing als Grundlage. Es stellt eine Funktion downloadPhotos() dar, über die drei Bilder über eine weitere Funktion namens downloadPhoto(_:) heruntergeladen werden.

func downloadPhotos() async -> [Photo] {
    let firstPhoto = await downloadPhoto("First")
    let secondPhoto = await downloadPhoto("Second")
    let thirdPhoto = await downloadPhoto("Third")
    return [firstPhoto, secondPhoto, thirdPhoto]
}

Diese Implementierung der downloadPhotos()-Funktion sorgt dafür, dass jedes der drei Bilder nacheinander heruntergeladen wird. Erst nach erfolgreichem Download des ersten Bildes beginnt der Download des zweiten, und so weiter.

Mithilfe von async let kann man die drei Bilder-Downloads auch parallel ablaufen lassen. Zu diesem Zweck deklariert man die drei Konstanten firstPhoto, secondPhoto und thirdPhoto zusätzlich mit dem Schlüsselwort async

func downloadPhotos() async -> [Photo] {
    async let firstPhoto = downloadPhoto("First")
    async let secondPhoto = downloadPhoto("Second")
    async let thirdPhoto = downloadPhoto("Third")
    return [await firstPhoto, await secondPhoto, await thirdPhoto]
}

Technisch gesehen läuft die downloadPhotos()-Funktion nun unbekümmert weiter, nachdem der Download des ersten Bildes angestoßen wurde. So startet die Funktion direkt parallel auch den Download der anderen zwei Bilder.

Entscheidend ist dann der Code des return-Befehls. An dieser Stelle werden alle drei Bilder benötigt, da sie als Ergebnis der Funktion zurückgeliefert werden sollen. Entsprechend müssen die drei Konstanten firstPhoto, secondPhoto und thirdPhoto beim Aufruf zusätzlich mit dem Schlüsselwort await versehen werden. Das teilt der Funktion mit, dass sie an dieser Stelle auf die Fertigstellung der parallel ablaufenden Downloads warten muss.

Fazit

async let stellt eine einfache und komfortable Möglichkeit dar, um in Swift 5.5 mehrere Tasks parallel ablaufen zu lassen. Erst, wenn die zugehörige Funktion zwingend auf das Ergebnis einer parallelen Aktion angewiesen ist, wartet die Funktion so lange mit der weiteren Ausführung, bis jenes Ergebnis vorliegt.

Euer Thomas


Kommentare

Schreibe einen Kommentar

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