AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 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

无法从非隔离上下文中引用 Actor 隔离属性“日志”

  • 772

我正在尝试学习 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 隔离属性“日志”

谢谢你!

swift
  • 1 1 个回答
  • 45 Views

1 个回答

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

    如果希望在不同的并发上下文中访问此对象,可以使用不同的同步机制await。例如,SE-0433中提到:

    在并发程序中,保护共享可变状态是确保以可解释的方式进行数据读写的核心基础问题之一。同步访问共享可变状态在 Swift 中并非新问题。我们引入了许多功能来帮助保护可变数据。Actor 是保护可变状态的良好默认解决方案,因为它将存储的数据隔离在其自己的域中。在任何给定时间点,只有一个任务会在 Actor 上执行,并对其拥有独占访问权限。多个任务无法同时访问受 Actor 保护的状态,尽管它们可以在潜在的暂停点(用 表示await)交错执行。通常,Actor 方法也非常适合代码组织,因为 Actor 的状态以及对该状态的操作在逻辑上声明在同一个位置:Actor 内部。

    并非所有代码都能够(或想要)采用 Actor。造成这种情况的原因可能多种多样,例如,代码可能必须同步执行,且不允许其他任务与其交错执行。或者,async引入对方法的影响可能会阻止无法使用 Swift 并发的遗留代码与受保护的状态进行交互。

    无论原因是什么,使用 Actor 可能并不可行。在这种情况下,Swift 目前缺少标准工具供开发者确保其并发数据结构中的正确同步。许多 Swift 程序选择使用互斥锁(或称 mutex)的临时实现。mutex 是一种易于使用的同步原语,它通过确保单个执行上下文对相关数据拥有独占访问权限来帮助保护共享的可变数据。主要问题是,这种同步原语没有统一的标准化实现,导致每个人都需要自行实现。

    因此,在 Swift 6 中可以使用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 }
        }
    }
    

    在 Apple 平台上,这使用了不公平锁。如果你想在早期版本的 OS 中这样做,可以将 替换Mutex为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 }
        }
    }
    

    现在,您可能想要访问“日志”本身:如果是这样,您可能只会公开它,并退出count引入竞争的各个计算属性(如 、 等),而是只返回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) }
        }
    }
    

    count这样,调用者就可以获得数组的安全副本,避免在不同线程上发生的集合的获取和变异之间的竞争。

    • 1

相关问题

  • IOS(模拟器)--> 本地 Vapor POST Image/png:Abort.413:有效负载太大

  • 在保存到 Core Data 之前调整图像大小

  • 如何在一个函数中快速处理两个完成处理程序

  • 为什么可编码键和值的字典本身不可编码?

  • 有没有办法将assertionFailure嵌入到'??'中 表达

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve