async/await
— это современный подход к написанию асинхронного кода, который делает его похожим на синхронный, сохраняя все преимущества асинхронности.
async
- маркирует функцию как асинхроннуюawait
- точка приостановки, где функция может быть прерванаfunc fetchData() async throws -> Data {
let url = URL(string: "https://api.example.com/data")!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
Task
— это единица выполнения асинхронного кода, аналогичная понятию "задачи" в других языках.
Task {
let data = try await fetchData()
print("Received data: \(data)")
}
priority
)cancel()
)Actor
— это тип, обеспечивающий безопасный доступ к изменяемому состоянию в многопоточной среде.
actor BankAccount {
private var balance: Double = 0
func deposit(_ amount: Double) {
balance += amount
}
func withdraw(_ amount: Double) -> Double {
if balance >= amount {
balance -= amount
return amount
}
return 0
}
func currentBalance() -> Double {
return balance
}
}
let account = BankAccount()
Task {
await account.deposit(100)
let current = await account.currentBalance()
print("Current balance: \(current)")
}
await
Безопасность:
Производительность:
Читаемость:
actor DataCache {
private var storage: [String: Data] = [:]
func getData(for key: String) async -> Data? {
if let data = storage[key] {
return data
}
// Асинхронная загрузка, если нет в кэше
guard let data = try? await downloadData(from: key) else {
return nil
}
storage[key] = data
return data
}
private func downloadData(from urlString: String) async throws -> Data {
let url = URL(string: urlString)!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
}
// Использование
Task {
let cache = DataCache()
if let data = await cache.getData(for: "https://example.com/image.jpg") {
print("Got data: \(data.count) bytes")
}
}
Вместе они образуют мощную систему конкурентности в Swift, которая сочетает безопасность, производительность и удобство разработки.