@Observable 宏:不使用 @ObservationIgnored 标记属性会导致任何问题吗?

问题描述 投票:0回答:1

我正在使用 @Observable 宏将旧的 ObservableObjects 迁移到新的 Observation 方法。如果我不使用 @ObservationIgnored 标记之前未发布的属性,会发生什么?

  1. 是否会有任何有意义的性能/功率损失?或者还有其他复杂的情况,比如保留参考资料?
  2. 如果没有观察者对象/视图观察该属性怎么办?使用 @ObservationIgnored 注解属性和根本不注解在性能上会有什么区别吗?

示例:

原班:

class Class1: ObservableObject {
    @Published var a: Int = 1
    var b: Int = 2
}

新班级:

@Observable class Class2 {
    var a: Int = 1
    var b: Int = 2 // Do I absolutely need to use @ObservationIgnored here?
}

谢谢!

swift swiftui observable observation observation-framework
1个回答
0
投票

@ObservationIgnored
类中删除
@Observable
与将
@Published
添加到
ObservableObject
大致相似。它可以是一个突破性的改变,因为它可能会改变现有的行为。

一个简单但人为的例子是:

@Observable
class Foo {
    var x = 0
    @ObservationIgnored
    var y = 0
}

struct ContentView: View {
    @State var foo = Foo()
    var body: some View {
        VStack {
            Text(foo.x, format: .number)
            Text(foo.y, format: .number)
            Button("Change X") {
                foo.x += 1
            }
            Button("Change Y") {
                foo.y += 1
            }
        }
    }
}

在这里,点击“更改 Y”永远不会更改第二个

Text
。只有在您点击“更改 X”后,第二个
Text
才会更新以反映
foo.y
的当前值。

请注意,这并不意味着

foo.y += 1
不会改变
foo.y
的值。
foo.y
仍然设置正确。只是视图的
body
没有被调用来反映变化。

删除

@ObservationIgnored
将改变行为。点击“更改 Y”现在将始终更新视图。

如果没有视图依赖于“忽略”属性(这意味着您没有调用

body
中属性的 getter/setter),那么行为不会发生变化。

在性能方面,可能会有更多的视图更新,如前面提到的示例所解释的,但假设没有视图依赖于被忽略的属性,那么您只会在被忽略的属性的 getter/setter 中获得一点额外的开销,因为宏生成的 getter/setter 将属性访问记录到观察注册器中。我认为这不会有明显的差异。

© www.soinside.com 2019 - 2024. All rights reserved.