英文:
Can a property be safely accessed from async functions?
问题
使用Swift 5.5的async/await,我们可以从两个不同的异步函数中访问相同的属性吗?
例如,假设您有以下代码:
var foobarInstance: FooBar?
func start() async {
foobarInstance = await buildFooBar()
....
}
func process() async {
if let foo = self.foobarInstance {
// 进行一些操作
}
}
这种方式访问self.foobarInstance
是安全的吗?Swift是否会自动处理这个问题?
英文:
With Swift's 5.5 async/await, can we access the same property from two different async functions?
For example, let's say you have:
var foobarInstance: FooBar?
func start() async {
foobarInstance = await buildFooBar()
....
}
func process() async {
if let foo = self.foobarInstance {
// do something
}
}
Is it safe to access self.foobarInstance
that way? Does Swift handle that automatically?
答案1
得分: 3
async
函数本身是不足够的。但如果属性和方法都是 actor 隔离的,那么是的,你可以从多个方法中访问相同的属性。例如:
actor Qux {
private var foobar: FooBar?
func start() async {
foobar = await buildFooBar()
…
}
func process() async {
if let foobar {
// 使用 `foobar` 做一些事情
}
}
}
在这种情况下,我使用了显式的 actor
类型,但它也适用于全局 actor(如 @MainActor
)。
我不知道你的 FooBar
类型是什么,但如果你在 actor 隔离上下文之外暴露它,你可能需要确保它也是线程安全的(例如,Sendable
)。在这种情况下,我明确将它设置为 private
,以确保它不会不必要地暴露在此上下文之外。
请参考 WWDC 2021 视频 使用 Swift actor 保护可变状态 和 2022 视频 使用 Swift Concurrency 消除数据竞争。
英文:
The async
functions alone are not sufficient. But if both the property and the methods are actor-isolated, then, yes, you can access the same property from multiple methods. E.g.:
actor Qux {
private var foobar: FooBar?
func start() async {
foobar = await buildFooBar()
…
}
func process() async {
if let foobar {
// do something with `foobar`
}
}
}
In this case, I am using an explicit actor
type, but it also works with global actors (such as @MainActor
).
I do not know what your FooBar
type is, but if you ever expose it outside this actor-isolated context, you may want to make sure that it is thread-safe, too (e.g., Sendable
). In this case, I explicitly made it private
to ensure it was not unnecessarily exposed outside of this context.
See WWDC 2021 video Protect mutable state with Swift actors and 2022 video Eliminate data races using Swift Concurrency.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论