与现有代码集成actors
似乎并不像 Apple 希望你相信的那么简单。考虑以下简单的演员:
actor Foo {
var value: Int = 0
}
尝试从任何AppKit/UIKit
(无任务)控制器访问此属性是行不通的,因为每个控制器Task
都是异步的。
class AppKitController {
func myTaskLessFunc() {
let f = Foo()
var v: Int = -1
Task { v = await f.value }
}
}
这会给你预期的错误Mutation of captured var 'v' in concurrently-executing code
,如果你试图锁定它也不起作用。nonisolated
演员方法也无济于事,因为你会遇到同样的问题。
那么如何在无任务上下文中同步读取参与者属性呢?