async/await 并发
async/await、Task/async let、MainActor、Continuation
async/await 并发
Swift 5.5 引入 async/await——用同步写法写异步代码。Task 创建异步任务,MainActor 确保 UI 线程安全。
学完本章你将: 掌握 async/await、Task、MainActor。
async 函数
swift
func fetchUser(id: Int) async throws -> String {
let url = URL(string: "https://api.example.com/users/\(id)")!
let (data, _) = try await URLSession.shared.data(from: url)
return String(data: data, encoding: .utf8) ?? ""
}
// 调用
Task {
do {
let user = try await fetchUser(id: 1)
print(user)
} catch {
print(error)
}
}
并发执行
swift
// async let —— 并发启动多个异步任务
func loadAll() async throws -> (String, String, String) {
async let user = fetchUser(id: 1)
async let posts = fetchPosts()
async let settings = fetchSettings()
return try await (user, posts, settings) // 三个请求并发
}
Task 与 MainActor
swift
// 在后台执行
Task.detached {
let data = try await loadData()
// 回到主线程更新 UI
await MainActor.run {
self.updateUI(with: data)
}
}
// @MainActor —— 标记始终在主线程执行
@MainActor
class ViewModel: ObservableObject {
@Published var users: [User] = []
func load() async {
users = try await fetchUsers()
}
}