Удаляет ли SwiftUI дубликаты с подписчика на свойство @Published?

#swiftui #combine

Вопрос:

Если у меня есть 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 на подписчиков, которых он создает?

Я предполагаю последнее, но я изо всех сил пытался найти какую-либо документацию по этому вопросу.

Ответ №1:

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, он бы уже разбился 😀