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



swiftUI新手,只是想通过swift的教程了解这一部分的黑客操作,并试图在swift.org中查找willSet的文档,但我觉得我可能误解了它的实际工作方式。

这是代码(评论是我的(:

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)")
}
}

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

那么,如果是这样的话,如果刷新发生在实际更改之前,那么UI如何使用newValue刷新呢?

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

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

最新更新