Swiftui 如果willSet属性在ObserveObject更改之前发出更改通知,@ObserveObject如何刷新UI?

Swiftui 如果willSet属性在ObserveObject更改之前发出更改通知,@ObserveObject如何刷新UI?,swiftui,Swiftui,对于swiftUI来说是新手,我只是想通过swift的本部分教程了解HackingWithwift,并试图在swift.org中查找willSet的文档,但我觉得我可能误解了它的实际工作原理 下面是代码(注释是我的): 我不明白的是,如果将设置和对象将更改。send()在值更改之前发送更改通知。。我假设此通知首先到达@ObservedObject,然后刷新UI。但我的问题是当它刷新UI时,是在值更改之前还是之后刷新??我知道它看起来像是在之后,但是willSet和objectWillChange

对于swiftUI来说是新手,我只是想通过swift的本部分教程了解HackingWithwift,并试图在swift.org中查找
willSet
的文档,但我觉得我可能误解了它的实际工作原理

下面是代码(注释是我的):

我不明白的是,如果
将设置
对象将更改。send()
在值更改之前发送更改通知。。我假设此通知首先到达
@ObservedObject
,然后刷新UI。但我的问题是当它刷新UI时,是在值更改之前还是之后刷新??我知道它看起来像是在之后,但是
willSet
objectWillChange.send()
文档建议它在更改之前发送更改通知


如果是这种情况,如果刷新发生在实际更改之前,UI如何使用newValue刷新?

值更改和UI更新都在主队列上运行,并且只有一个队列。在SwiftUI更新主队列上的值的任务可以运行之前,该值将被更新


那么,为什么要在更新值之前发送消息呢?因为这使SwiftUI有机会观察上一个值以准备任何动画。这意味着SwiftUI的一部分正在另一个队列上运行,但当实际更新该值时,SwiftUI将安排一个任务在主队列上运行,并且该值将在当时被更新。

感谢您的解释。我想我明白了,所以我们基本上是在告诉UI注意下一个变化?然后当它发生变化时,它可以进行设置值的工作,然后它就不再关注任务队列中其他更重要的事情,而不是持续观察对象的变化?因此,我认为这种方法对swiftUI运行更为有效?
objectWillChange.send()
消息本质上是“我们正在更改您关心的值。请注意它的当前值,并准备尽快重新绘制自己。”swiftUI不必等待值更改,因为它在主队列上获得的第一次机会将具有新值。
class DelayedUpdater: ObservableObject {
    var value = 0 {
        // call this code right before the object changes, which is what willSet does.
        willSet {
            // this sends the change notification manually so that any views using this value will refresh.
            objectWillChange.send()
        }
    }

    init() {
        for i in 1...10 {
            DispatchQueue.main.asyncAfter(deadline: .now() + Double(i)) {
                self.value += 1
            }
        }
    }
}

struct ContentView: View {
    @ObservedObject var updater = DelayedUpdater()

    var body: some View {
        Text("Value is: \(updater.value)")
    }
}