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).
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.
Întrebări & Exemple de Cod:
Concurrency Modernă în Swift: async/await, Task & ActorsAi o nelămurire despre utilizarea comenzii
Concurrency Modernă în Swift: async/await, Task & Actorssau 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.