如何同步对具有 didSet 的属性的访问?

2023-12-30

如何同步使用 didSet 的属性的访问(使用 GCD 或 objc_sync_enter)?

我有一处房产,有一个房产观察员。如何使用私有队列来同步属性的获取/设置

var state: State = .disconnected {
  // Q: How to sync get/set access here?
  didSet {
    // do something
  }
}

最简单的方法是使用串行队列

import Dispatch

struct S {
    private var i: Int = 0 {
        didSet {
            print("someone did set new value:", i)
        }
    }
    private let queue = DispatchQueue(label: "private", qos: .userInteractive) // high priority
    var value: Int {
        get {
            return queue.sync {
                return i
            }
        }
        set {
            if newValue == value {
                return
            }
            queue.sync {
                i = newValue
            }
        }
    }
}

更高级的示例使用并发读取和同步屏障进行写入

import Dispatch

struct S {
    private var i: Int = 0 {
        didSet {
            print("someone did set new value:", i)
        }
    }
    private let queue = DispatchQueue(label: "private", qos: .userInteractive, attributes: .concurrent) // high priority
    var value: Int {
        get {
            return queue.sync {
                return i
            }
        }
        set {
            if newValue == value {
                return
            }
            queue.sync(flags: .barrier) {
                i = newValue
            }
        }
    }
}

对于类属性,您可以使用并发私有队列并同时从不同线程读取并使用屏障异步分派写入

import Dispatch

class S {
    private var i: Int = 0 {
        didSet {
            print("someone did set new value:", i)
        }
    }
    private let queue = DispatchQueue(label: "private", qos: .userInteractive, attributes: .concurrent) // high priority
    var value: Int {
        get {
            return queue.sync {
                return i
            }
        }
        set {
            if newValue == value {
                return
            }
            queue.async(flags: .barrier) { [unowned self] in
                self.i = newValue
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何同步对具有 didSet 的属性的访问? 的相关文章

随机推荐

  • 关于C++复制构造函数调用的问题

    我试图找出这两行代码之间的区别 我们得到的 Count 是我们的类名 C1 和 C2 是该类的对象 没有给出如何以及何时声明这些类的信息 Count C2 C1 Statement 1 Count C2 C1 Statement 2 没有提
  • PHP 从函数中获取变量

    function first foreach list as item variable item gt ID item gt title gives varible 10 some text 10 can be replaced with
  • 使用密钥大小小于 2048 的 RSA 安全密钥创建 JWT 令牌时出错

    我在尝试创建时遇到异常JWT https jwt io C Web API 应用程序中的令牌 测试环境 平台 带有 net框架的Windows 10 x64 4 6 1 jwt NuGet 包 System IdentityModel To
  • Vuejs 3 和 Bootstrap 5 模态可重用组件以编程方式显示

    尝试使用 vuejs 3 和可组合 API 创建一个基于 Bootstrap 5 的 半 可重用模态组件 设法让它部分工作 给定 主要是标准 Bootstrap 5 模式 但基于 show 属性添加类 以及正文和页脚中的插槽
  • 出于验证目的迭代方法的参数

    我一直在想 能够做这样的事情会很有用 例如 检查参数是否为空引用并最终抛出异常 这将节省一些输入 并且如果添加了新参数 就不可能忘记添加检查 好吧 除非你算一下 public void Foo string x object y Strea
  • 在运行时获取布局高度和宽度android

    如何获取在 xml 中定义为 fill parent 的高度和宽度的线性布局的宽度和高度 我尝试过 onmeasure 方法 但我不知道为什么它没有给出准确的值 在 oncreate 方法完成之前 我需要在 Activity 中使用这些值
  • 训练误差和测试误差相差多少才被认为是合适的? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在研究回归问题 我使用 ad boost 和决策树进行回归 并使用 r 2 作为评估指标 我想知道训练 r 2 和测试 r 2 之间的差异有
  • 解析 Roslyn 中的参数类型

    我正在使用 Roslyn 来实现自定义业务规则 目前 我有点卡住了 我必须在调用方法时验证参数的类型 验证该方法正在被调用或包含参数时没有问题 我已经通过使用 GetSymbolInfo 来获取当前语法的符号来解析 IdentifierNa
  • 获取“sed 错误 - 非法字节序列”(在 bash 中)[重复]

    这个问题在这里已经有答案了 进行一些流编辑以更改令人讨厌的 Parallels 图标 它的开发很差 并且嵌入到应用程序本身中 而不是作为图像文件 所以我找到了这个 sed 命令 它有一些很好的反馈 sudo sed i bak s Para
  • Python:检查负数

    我试图向该字符串添加一段代码以检查第一个位置是否有负数 如果代码识别出负数 则应返回 False 我在用户输入命令中遇到 int 和 str 问题 抱歉 Python 新手 def is number S if s lt 0 print F
  • grails 2.3.4 与 Angular js 结合的智能文件夹结构

    在不使用 grails angularjs 插件的情况下 grails 2 3 4 与 angularjs 结合的智能文件夹结构是什么 目前我已将所有内容打包到webapp folder 组织目录的方法有很多 但是 我们使用的方式 我将其称
  • 如何禁用和启用 android ScrollView 上的滚动? [复制]

    这个问题在这里已经有答案了 我是一名android开发人员 我也想使用ScrollView 这个ScrollView需要一段时间禁用滚动 一段时间启用滚动 但是我无法禁用滚动 如何实现它 请帮助我 我还尝试使用一些代码 例如 s fullp
  • 在循环期间删除列表中的项目

    我有下面的代码 我正在尝试从列表中删除两个字符串predict strings and test strings如果其中一个已在另一个中找到 问题是我必须将它们分开并检查另一个字符串中是否存在一个字符串的 部分 如果存在 那么我只是说存在匹
  • Matlabpool打开worker非常慢

    我刚刚组装了一个新设备 i7 4770K 512gb SSD 16gb DDR3 2133 mhz ram 并安装了 MATLAB r2013a 当我调用 matlabpool 命令时 需要花费很长时间才能打开每个单独的工作线程 您在任务管
  • ruby 中的数据库连接池

    我刚刚开始使用 Ruby 正在使用 Sinatra 但找不到在请求之间共享数据库连接的方法 我来自 Java Web 开发 你必须做的基本事情之一就是池化数据库连接 所以我确信 Ruby 中存在类似的东西 但我只是找不到它 ActiveRe
  • C# 无法使“notnull”类型可为空

    我正在尝试创建一个类似于 Rust 的类型Result或哈斯克尔的Either到目前为止我已经做到了 public struct Result
  • 调用未定义函数 odbc_connect() php 7

    我正在测试 php 7 并遇到此错误 致命错误 未捕获错误 调用未定义的函数 odbc connect 从文档页面 http php net manual en function odbc connect php http php net
  • 终止挂起查询(事务中空闲)

    我正在使用带有 Crane Postgres 选项的 Heroku 当我的本地计算机崩溃时 我正在从本地计算机对数据库运行查询 如果我跑 select from pg stat activity 其中一个条目有
  • 在 Xcode 4 中添加框架 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Xcode 4 中 添加现有框架 https stackoverflow com questions 3352664 how to add existing frameworks in xco
  • 如何同步对具有 didSet 的属性的访问?

    如何同步使用 didSet 的属性的访问 使用 GCD 或 objc sync enter 我有一处房产 有一个房产观察员 如何使用私有队列来同步属性的获取 设置 var state State disconnected Q How to