Загрузка просмотров и onAppear
У меня есть приложение, которое будет отображать длинные списки данных. Помимо тестирования Lazy Stacks, асинхронной загрузки и других методов, я хотел бы предоставить сообщение о загрузке. Интересно то, что оказывается, что только самые атомарные представления (в данном случае
Scrollview
, а не
List
) пересчитываются. Код следующий:
struct MainView: View {
@Environment(\.managedObjectContext) private var viewContext
@ObservedObject var nodeSet: NodeSet
@State private var viewIsLoaded: Bool = false
var body: some View {
VStack {
SectionBar(nodeSet: nodeSet, viewIsLoaded: $viewIsLoaded)
.frame(maxWidth: .infinity, maxHeight: 40)
Divider()
DataView(nodeSet: nodeSet, viewIsLoaded: $viewIsLoaded)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
}
struct DataView: View {
@Environment(\.managedObjectContext) private var viewContext
@ObservedObject var nodeSet: NodeSet
@Binding var viewIsLoaded: Bool
var body: some View {
ZStack {
ScrollView {
ForEach(nodeSet.nodes.sorted().indexed(), id: \.1.self) { index, node in
NodeView(node: node)
.onAppear{
if index+1 == nodeSet.nodes.count {
viewIsLoaded = true
print("Node List has Loaded.") // 1
}
}
}
.onAppear{ print("ForEach Loaded") } // 2
}
VStack {
Text("Loading...")
.padding()
.background(Color(.systemGray3))
.border(Color("AccentColor"))
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(.systemGray2).opacity(0.5))
.isVisible(!viewIsLoaded) // convenience view extension
}
.onAppear{ print("ZStack Loaded") } // 3
}
}
Из трех
print
все 3 строки печатаются при начальной загрузке представления, но при изменении списка (это то, что делает SectionBar, я удалил код фильтрации) только № 3 будет печататься при пересчете данных. Итак, очевидно, что ForEach и ZStack не перерисовываются, а только отдельные элементы внутри ForEach. Добавление
indexed()
кажется немного запутанным, и все еще есть задержка примерно на 1/4 секунды после
// 1
печатается и до того, как появятся данные, что наводит меня на мысль, что здесь есть скрытый шаг.
Каков наиболее надежный способ проверить, загружены ли данные представления, и что происходит между строками?
//1
а вид появляется? Или как лучше создать загрузочное сообщение?
Заранее спасибо.