Estou tentando aprender Swift 6. O problema que tenho enfrentado é que não consigo ler (não tentar modificar) as propriedades de actor
um UI class
.
É possível ler sem adicionar propriedades armazenadas extras ou aguardar?
Você pode me dar alguma solução para isso?
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
}
}
Erro:
A propriedade 'logs' isolada do ator não pode ser referenciada a partir de um contexto não isolado
Obrigado!
Você pode usar um mecanismo de sincronização diferente se quiser acessar isso de diferentes contextos de simultaneidade sem
await
. Por exemplo, SE-0433 diz:Então, no Swift 6 pode-se usar
Mutex
:Em plataformas Apple, isso usa um bloqueio injusto. E se você quiser fazer isso em versões anteriores do sistema operacional, pode substituir o
Mutex
por umOSAllocatedUnfairLock
:Agora, provavelmente, você pode querer acessar os próprios “logs”: se for o caso, você pode simplesmente expor isso e retirar propriedades computadas individuais como
count
, e similares, que introduzem corridas e, em vez disso, apenas retornar ologs
:Dessa forma, o chamador obtém uma cópia segura do array, evitando disputas entre a busca
count
e as mutações da coleção que podem estar ocorrendo em threads diferentes.