Z
ZHANK
现代 Swift

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()
    }
}