Asynchrone Programmierung in Swift: Vollständiger Leitfaden für iOS/macOS

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in die asynchrone Programmierung in Swift



Moderne iOS- und macOS-Apps erfordern hohe Reaktionsfähigkeit und Leistung. Asynchrone Programmierung in Swift ermöglicht es, langwierige Operationen (Netzwerkanfragen, Dateiarbeit, Datenverarbeitung) auszuführen, ohne den Hauptthread (Main Thread) zu blockieren. Ab Swift 5.5 hat Apple das leistungsstarke Modell Swift Concurrency eingeführt, das auf den Schlüsselwörtern async und await basiert und das Schreiben von asynchronem Code im Vergleich zu traditionellen Closures (completion handlers) oder DispatchQueue erheblich vereinfacht.



In diesem Leitfaden werden wir alle wichtigen Konzepte im Detail durchgehen: von den Grundlagen von async/await bis zu fortgeschrittenen Themen wie Actors und Task Groups. Sie erfahren, wie Sie sicheren, lesbaren und effizienten asynchronen Code für Ihre Swift-Projekte schreiben.



Grundlagen von async/await in Swift



Die Schlüsselwörter async und await sind das Herzstück von Swift Concurrency. Sie ermöglichen es, asynchronen Code zu schreiben, der wie synchroner Code aussieht, was die Lesbarkeit erheblich verbessert und die Anzahl der Fehler reduziert.



Deklaration einer asynchronen Funktion



Um eine Funktion als asynchron zu deklarieren, fügen Sie das Schlüsselwort async nach der Parameterliste, aber vor dem Rückgabetyp hinzu. Eine solche Funktion kann ihre Ausführung unterbrechen.



func fetchUserData(from url: URL) async throws -> Data {    let (data, response) = try await URLSession.shared.data(from: url)    // Überprüfung des HTTP-Status    guard let httpResponse = response as? HTTPURLResponse,          httpResponse.statusCode == 200 else {        throw URLError(.badServerResponse)    }    return data}


Aufruf einer asynchronen Funktion mit await



Zum Aufruf einer asynchronen Funktion wird das Schlüsselwort await verwendet. Es zeigt an, dass der aktuelle Code an dieser Stelle pausieren kann, bis das Ergebnis vorliegt.



func loadProfile() async {    let url = URL(string: "https://api.example.com/user/profile")!    do {        let data = try await fetchUserData(from: url)        // Datenverarbeitung (z.B. JSON-Dekodierung)        print("Daten erhalten: \\(data.count) Bytes")    } catch {        print("Fehler beim Laden des Profils: \\(error.localizedDescription)")    }}


Async let für parallele Aufgaben



Wenn Sie mehrere unabhängige asynchrone Operationen gleichzeitig ausführen müssen, verwenden Sie die Konstruktion async let. Dadurch können Aufgaben parallel gestartet und auf alle Ergebnisse gewartet werden.



func loadDashboardData() async -> Dashboard {    async let user = fetchUserData(from: URL(string: "https://api.example.com/user")!)    async let posts = fetchUserData(from: URL(string: "https://api.example.com/posts")!)    async let notifications = fetchUserData(from: URL(string: "https://api.example.com/notifications")!)

// Warten auf alle Ergebnisse let (userData, postsData, notifData) = await (try user, try posts, try notifications) return Dashboard(user: userData, posts: postsData, notifications: notifData)}


Task und Structured Concurrency



Swift Concurrency basiert auf dem Konzept der Structured Concurrency. Das bedeutet, dass jede asynchrone Aufgabe eine klare Lebensdauer und eine Eltern-Kind-Beziehung hat. Der grundlegende Baustein ist Task.



Erstellen einer neuen Aufgabe



Task erstellt eine neue asynchrone Arbeitseinheit. Sie können eine Aufgabe in einem synchronen Kontext erstellen (z.B. in viewDidLoad).



class ViewController: UIViewController {    override func viewDidLoad() {        super.viewDidLoad()        // Erstellen einer neuen Aufgabe zur Ausführung asynchroner Arbeit        Task {            let data = try await fetchUserData(from: URL(string: "https://                

Blogs

Buchempfehlungen