Загрузка просмотров и 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а вид появляется? Или как лучше создать загрузочное сообщение?

Заранее спасибо.

0 ответов

Другие вопросы по тегам