概览
在 Swift 结构化并发构成的体系中,一个称为“演员”(Actor)的成员扮演了非常重要的角色,它被用来隔离和同步执行中的数据。
除了普通 Actor 以外,还有一个全局“演员”(Global Actor)的概念,它是做什么的?又有什么与众不同的长处呢?
在本篇博文中,您将学到如下内容:
- 概览
- 1. MainActor:“我是主角!”
- 2. 何为全局 Actor?
- 3. “开始你的表演!”
- 总结
掌握 Swift 结构化并发是迈向现代化并行开发模型的必由之路,而 Actor 以及 Global Actor 又是其中不可或缺的重要元素!
那还等什么呢?小伙伴们,Let‘s playing!!!😉
1. MainActor:“我是主角!”
我相信即使是 Apple 开发中头发浓密的初学者们也肯定都知道:所有和界面相关的操作一定要在主线程(Main Thread)中完成。
对于 Swift 结构化并发中的 Actor 来说,这一点也不能例外。
所以,一个所谓的“绝对主角”(Main Actor)踏着七彩祥云“从天而降”来帮助我们排忧解难。在 UIKit 中,所有和界面相关的类,以及它们对应的方法和属性,默认都包容在 MainActor 之中:
在 SwiftUI 中,视图的 body 属性也很“识趣”的与 MainActor 成了好朋友:
在 Swift 结构化并发模型中, 使用 MainActor 可以确保我们的任务都毫无悬念的将会在主线程中运行。
在某些非 MainActor 的运行上下文中,我们也可以非常方便的将其切换到主线程上去:
Task {
// 非 MainActor 运行上下文
await MainActor.run {
// MainActor 运行上下文
}
}
或者,我们还可以用闭包的修饰语法糖来让编译器明白我们要在 MainActor 中运行的“坚定决心”:
Task {
await withTaskGroup(of: Void.self) {
group in
group.addTask {
@MainActor in
try? await Task.sleep(for: .seconds(1.0))
print(Thread.current)
// 在主线程中了,加油妆点界面吧!
}
await group.waitForAll()
}
}
如上所述,MainActor 就是一个在主线程上下文中运行的 Actor,更确切的说:它是运行在主线程中的一个全局(Global)Actor!
2. 何为全局 Actor?
所谓全局 Actor 是一种全局唯一的 Actor 类型,它用于隔离程序任何位置中的各种声明代码。
说到全局 Actor,我们很自然的就想到普通的 Actor。做个不太恰当的比喻:如果说普通的 Actor 创建出一个个数不胜数的隔绝小岛,那么全局 Actor 形成的则是一片壮丽浩瀚的隔绝大陆!
上面我们讨论过,MainActor 其