Concurrency Modernă în Swift: async/await, Task & Actors în Swift (iOS & macOS)

Ghid complet pentru modelul de concurență structurată din Swift: async/await, gestionarea task-urilor paralele și protecția împotriva data-race cu Actors.

Sintaxă Swift
actor BankAccount { func deposit() async { ... } }

Modelul de concurență din Swift a fost complet reimaginat pentru a înlocui callback-urile nestructurate (GCD – Grand Central Dispatch și completion handlers). Prin async/await, Concurență Structurată și Actors, Swift garantează că operațiunile asincrone sunt ușor de citit și libere de condiții de concurență (data races) verificate la compilare (Swift 6 Strict Concurrency Checking).

Exemplu: Apel asincron cu async/await și Actor pentru sincronizare sigură
import Foundation

// 1. Definirea unui Actor: garantează acces exclusiv și sincron la starea internă
actor ContBancar {
    private(set) var soldDisponibil: Double = 1000.0
    
    // Metodă asincronă protejată automat împotriva accesului concurent
    func retragere(suma: Double) -> Bool {
        guard soldDisponibil >= suma else {
            return false
        }
        soldDisponibil -= suma
        return true
    }
}

// 2. Funcție asincronă care utilizează noul model de rețea URLSession
func descarcaDateUtilizator(din urlString: String) async throws -> String {
    guard let url = URL(string: urlString) else {
        throw URLError(.badURL)
    }
    
    // Suspendă execuția până la primirea răspunsului HTTP, eliberând firul de execuție
    let (data, response) = try await URLSession.shared.data(from: url)
    
    guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
        throw URLError(.badServerResponse)
    }
    
    return String(decoding: data, as: UTF8.self)
}

// 3. Execuția concurentă structurată cu Task și TaskGroup
func procesareParalela() async {
    let cont = ContBancar()
    
    // Lansăm două operațiuni concurente în paralel
    async let retragere1 = cont.retragere(suma: 400.0)
    async let retragere2 = cont.retragere(suma: 800.0)
    
    let rezultate = await (retragere1, retragere2)
    print("Rezultat Retragere 1: \(rezultate.0), Retragere 2: \(rezultate.1)")
    
    let soldRamas = await cont.soldDisponibil
    print("Sold final în cont: \(soldRamas) RON")
}

De ce actorii previn complet erorile de tip Data Race

Un actor este similar unei clase (reference type), dar cu o proprietate critică: izolează complet accesul la starea sa mutabilă. Compilatorul Swift forțează orice apel din exteriorul actorului să utilizeze cuvântul cheie await, permițând actorului să proceseze mesajele secvențial, fără a fi nevoie de blocaje manuale de tip mutex sau lock.

Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Concurrency Modernă în Swift: async/await, Task & Actors

Ai o nelămurire despre utilizarea comenzii Concurrency Modernă în Swift: async/await, Task & Actors sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.