gpt4 book ai didi

swift - Combine 如何知道 ObservableObject 实际发生了变化

转载 作者:行者123 更新时间:2023-12-03 09:23:51 25 4
gpt4 key购买 nike

ObservableObject由 Combine 框架定义的协议(protocol)有一个 objectWillChange发布者属性,让您知道此对象的属性何时会更改,这意味着,如果此发布者的订阅者在获得此将更改事件时读取其值,他们仍将读取更改之前的值,我是什么试图理解的是:

  • SwiftUI 之类的框架如何知道该值实际上是 做了更改(即:他们如何获得新值)当您唯一可以订阅的事件似乎是 will change 时?底层机制是 Combine 框架中公开可用的 API 吗?
  • 如何获得 ObservableObject 的实际新值在您收到 will change 事件后?
  • 最佳答案

    SwiftUI 不知道 ObservableObject实际上改变了。 SwiftUI 信任您。如果你告诉它对象会改变(通过使 objectWillChange 发出输出),那么 SwiftUI 会假定对象会改变,并安排显示更新。

    我不是 100% 确定为什么 Apple 选择了 objectWillChange作为信号。在 WWDC 2019 上,该属性实际上是 didChange ,而不是 objectWillChange .他们在 Xcode 11 仍处于测试阶段时对其进行了更改。也许他们所做的是在 objectWillChange 时获取对象的状态。发出,然后在需要更新屏幕时再次抓取它,并以某种方式比较值。

    关于objectWillChange后如何获取对象的值发射,这取决于你。他们使用 SwiftUI 的方式是注册一个 CFRunLoopObserver 对于 .beforeWaiting 事件。当观察者运行时,它会重新渲染任何具有 ObservableObject 的 View 。 s 已发出信号。

    请注意,如果您使用 @Published将值存储在您的 ObservableObject 中的属性,然后您可以使用 $ 订阅属性自己的发布者字首。例如:

    class MyObject: ObservableObject {
    @Published var value: Int = 0
    }

    let object = MyObject()
    let ticket = object.$value
    .sink { print("new value: \($0); old value: \(object.value)") }

    object.value = 1
    Published wrapper 在订阅时发布当前值,然后在每次更改时发布新值。但请注意,它发布了新值 之前 存储它,如上面的示例代码所示,输出如下:
    new value: 0; old value: 0
    new value: 1; old value: 0

    关于swift - Combine 如何知道 ObservableObject 实际发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59519530/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com