Swift 并发让你能写出读起来像同步代码的异步代码,使用 async/await,同时编译器会强制数据竞争安全。Task 启动并发工作,actor 保护可变状态,而 @MainActor 保证 UI 代码运行在主线程上。
await 标记一个挂起点:函数可以在那里暂停,把线程让给其他工作,并在所等待的值就绪时恢复——没有回调,没有线程阻塞。
func loadProfile() async throws -> Profile {
let user = try await fetchUser() // suspends, thread reused
let posts = try await fetchPosts(user) // runs after user resolves
return Profile(user: user, posts: posts)
}
// Start async work from a sync context
Task {
let profile = try await loadProfile()
await MainActor.run { render(profile) } // UI update on main thread
}
actor 会串行化对其可变状态的访问——同一时刻只有一个任务能触及它,因此无需锁,也没有数据竞争。
actor ImageCache {
private var store: [URL: Image] = [:]
func image(for url: URL) -> Image? { store[url] } // isolated
func insert(_ img: Image, for url: URL) { store[url] = img }
}
@MainActor
final class ViewModel: ObservableObject { // all members run on main thread
@Published var title = ""
}
async let 和 TaskGroup 并行运行子任务并一起等待它们;取消父任务会取消其子任务。
async let a = fetchA() // both start immediately, in parallel
async let b = fetchB()
let (x, y) = try await (a, b)
@MainActor 会导致「Publishing changes from background thread」警告。Task { } 会继承 actor 上下文;Task.detached 不会——应谨慎使用它。async/await 取代了深度嵌套的 completion handler(「回调地狱」),如今编译器还能在编译期捕获数据竞争。面试官会考察你是否理解挂起点、actor 隔离和 @MainActor——正是这个模型让现代 iOS 并发既可读又安全。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠