SwiftUI 是否从订阅者中删除了@Published 属性 的重复项?

Does SwiftUI removeDuplicates from a subscriber to an @Published property?

如果我有一个ObservableObject喜欢...

class Foo: ObservableObject {
  @Published var value: Int = 1

  func update() {
    value = 1
  }
}

然后是这样的视图...

struct BarView: View {
  @ObservedObject var foo: Foo

  var body: some View {
    Text("\(foo.value)")
      .onAppear { foo.update() }
  }
}

这会导致视图不断刷新吗?还是 SwiftUI 在它创建的订阅者中做了类似于 removeDuplicates 的事情?

我想是后者,但我一直在努力寻找这方面的任何文档。

onAppear 在视图首次出现在屏幕上时调用。刷新视图时不会再次调用它,因为已发布的 属性 已更新,因此您在此处的代码只会增加一次值,然后更新视图。

如果您在视图主体中添加了更新对象的内容,那可能会触发某种异常,我现在想尝试一下。

好的,这个:

class Huh: ObservableObject {
    @Published var value = 1
    func update() {
        value += 1
    }
}

struct TestView: View {
    @StateObject var huh = Huh()
    
    var body: some View {
        huh.update()
        return VStack {
            Text("\(huh.value)")
        }.onAppear(perform: {
            huh.update()
        })
    }
}

只是让 SwiftUI 陷入无限循环。如果我不刚买了一个新的 Mac,它现在已经崩溃了 :D