我正在尝试学习 Swift 6。我一直面临的问题是,我无法读取(而不是尝试修改)来自的actor
属性UI class
。
是否可以在不添加额外存储属性或等待的情况下进行读取?
你能给我提供解决方案吗?
final actor Logger: Sendable {
static let current = Logger()
private(set) final var logs: [Int] = []
private init() { }
nonisolated var count: Int {
return self.logs.count
}
}
final class ViewController: NSViewController, NSTableViewDataSource {
@IBOutlet weak var tableView: NSTableView!
func numberOfRows(in tableView: NSTableView) -> Int {
return Logger.current.count
}
}
错误:
无法从非隔离上下文中引用 Actor 隔离属性“日志”
谢谢你!
如果希望在不同的并发上下文中访问此对象,可以使用不同的同步机制
await
。例如,SE-0433中提到:因此,在 Swift 6 中可以使用
Mutex
:在 Apple 平台上,这使用了不公平锁。如果你想在早期版本的 OS 中这样做,可以将 替换
Mutex
为OSAllocatedUnfairLock
:现在,您可能想要访问“日志”本身:如果是这样,您可能只会公开它,并退出
count
引入竞争的各个计算属性(如 、 等),而是只返回logs
:count
这样,调用者就可以获得数组的安全副本,避免在不同线程上发生的集合的获取和变异之间的竞争。