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