在页面加载之前Swift从Firebase获取数据

时间:2020-06-20 13:38:22

标签: swift firebase google-cloud-firestore

我有这段代码:

TypeConverters

此代码的目的是首先检索“ usta”集合中的所有数据。然后将其分配给ustaList,最后在@State var ustasList: Array<Usta> = [] func getUstalar() -> Array<Usta>{ var templist: Array<Usta> = [] DispatchQueue.main.async { self.db.collection("ustas").getDocuments(){ (querysnapshot,err) in for document in querysnapshot!.documents { let data = document.data() let newUsta = Usta(id: UUID(), name: data["name"] as! String, type: data["type"] as! String,telephone: data["telephone"] as! String) templist.append(newUsta) } } } return templist } var body: some View { NavigationView{ List{ ForEach(0..<self.ustasList.count){ i in Text(self.ustasList[i].name) } } } .onAppear(){ self.ustasList = self.getUstalar() } } 中显示ustaList中的元素。但是,List需要花费一些时间来执行,因此List不会显示任何内容。如何确保ustaList更新后,List显示数据。通常会快速移动,但是会自动更新。

1 个答案:

答案 0 :(得分:1)

确保将语句包装在Group中,并使用if检查是否有可用的内容。确保使用onAppear上的Group。像这样(经过测试并在iOS 13.5上运行):

struct ContentView: View {
    
    @State var stringArray: Array<String> = []

    func getSomeInformation() {
        // Wait for 2 seconds then append items
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.stringArray.append("a")
            self.stringArray.append("b")
            self.stringArray.append("c")
        }
    }
    
    var body: some View {
        Group { // Group all
            
            if self.stringArray.count > 0 { // Use if statement to check for content
                NavigationView() {
                    List() {
                        ForEach(self.stringArray, id: \.self) { item in
                            Text(item).foregroundColor(Color.black)
                        }
                    }
                }
            }
        }.onAppear() {
            self.getSomeInformation()
        }
    }
    
}

有一种无需使用Groupif语句的方法。如果对id的更改是这样的,请在ForEach语句中使用@State来使其区分并更新视图:

struct ContentView: View {
    
    @State var stringArray: Array<String> = []

    func getSomeInformation() {
        // Wait for 2 seconds then append items
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.stringArray.append("a")
            self.stringArray.append("b")
            self.stringArray.append("c")
        }
    }
    
    var body: some View {
        NavigationView() {
            List() {
                ForEach(self.stringArray, id: \.self) { item in
                    Text(item).foregroundColor(Color.black)
                }
            }
        }.onAppear() {
            self.getSomeInformation()
        }
    }
    
}