AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79589648
Accepted
Youmate
Youmate
Asked: 2025-04-24 07:56:48 +0800 CST2025-04-24 07:56:48 +0800 CST 2025-04-24 07:56:48 +0800 CST

A propriedade 'logs' isolada do ator não pode ser referenciada a partir de um contexto não isolado

  • 772

Estou tentando aprender Swift 6. O problema que tenho enfrentado é que não consigo ler (não tentar modificar) as propriedades de actorum 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!

swift
  • 1 1 respostas
  • 45 Views

1 respostas

  • Voted
  1. Best Answer
    Rob
    2025-04-25T01:42:29+08:002025-04-25T01:42:29+08:00

    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:

    Em programas concorrentes, proteger o estado mutável compartilhado é um dos principais problemas fundamentais para garantir que a leitura e a escrita de dados sejam feitas de forma explicável. Sincronizar o acesso ao estado mutável compartilhado não é um problema novo no Swift. Introduzimos muitos recursos para ajudar a proteger dados mutáveis. Atores são uma boa solução padrão para proteger o estado mutável, pois isolam os dados armazenados em seu próprio domínio. Em qualquer momento, apenas uma tarefa estará em execução "no" ator e terá acesso exclusivo a ele. Múltiplas tarefas não podem acessar o estado protegido pelo ator ao mesmo tempo, embora possam intercalar a execução em potenciais pontos de suspensão (indicados por await). Em geral, a abordagem do ator também se presta bem à organização do código, já que o estado do ator e as operações sobre esse estado são logicamente declarados no mesmo lugar: dentro do ator.

    Nem todo código pode (ou deseja) adotar atores. Os motivos para isso podem ser muito variados; por exemplo, o código pode ter que ser executado de forma síncrona sem qualquer possibilidade de outras tarefas intercalarem com ele. Ou o asyncefeito introduzido nos métodos pode impedir que código legado que não pode usar a Concorrência Swift interaja com o estado protegido.

    Seja qual for o motivo, pode não ser viável usar um ator. Nesses casos, o Swift atualmente carece de ferramentas padrão para que os desenvolvedores garantam a sincronização adequada em suas estruturas de dados concorrentes. Muitos programas Swift optam por usar implementações ad-hoc de um bloqueio de exclusão mútua, ou um mutex. Um mutex é uma primitiva de sincronização simples de usar para ajudar a proteger dados mutáveis ​​compartilhados, garantindo que um único contexto de execução tenha acesso exclusivo aos dados relacionados. O principal problema é que não existe uma única implementação padronizada para essa primitiva de sincronização, o que faz com que todos precisem criar a sua própria.

    Então, no Swift 6 pode-se usar Mutex:

    import Synchronization
    
    final class Logger: Sendable {
        static let current = Logger()
    
        private let logs = Mutex<[Int]>([])
    
        private init() { }
    
        var count: Int {
            logs.withLock { $0.count }
        }
    }
    

    Em plataformas Apple, isso usa um bloqueio injusto. E se você quiser fazer isso em versões anteriores do sistema operacional, pode substituir o Mutexpor um OSAllocatedUnfairLock:

    import os.lock
    
    final class Logger: Sendable {
        static let current = Logger()
    
        private let logs = OSAllocatedUnfairLock(initialState: [Int]())
    
        private init() { }
    
        var count: Int {
            logs.withLock { $0.count }
        }
    }
    

    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 o logs:

    import Synchronization
    
    final class Logger: Sendable {
        static let current = Logger()
    
        private let _logs = Mutex<[Int]>([])
    
        private init() { }
    
        var logs: [Int] {
            _logs.withLock { $0 }
        }
    
        func append(_ value: Int) {
            _logs.withLock { $0.append(value) }
        }
    }
    

    Dessa forma, o chamador obtém uma cópia segura do array, evitando disputas entre a busca counte as mutações da coleção que podem estar ocorrendo em threads diferentes.

    • 1

relate perguntas

  • IOS (simulador) --> Local Vapor POST Image/png: Abort.413: Payload Too Large

  • Redimensione a imagem antes de salvar no Core Data

  • Como lidar com dois manipuladores de conclusão em uma função swift

  • Por que um dicionário de chave e valores codificáveis ​​não é codificável?

  • Existe uma maneira de incorporar um assertionFailure em '?' expressão

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve