Быстро получить данные из Firebase до загрузки страницы - PullRequest
0 голосов
/ 20 июня 2020

У меня есть этот фрагмент кода:

@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()
        }
  }

Цель этого кода - сначала получить все данные из коллекции «usta». Затем назначьте его ustaList и, наконец, отобразите элементы в ustaList в List. Однако для выполнения getUstalar требуется некоторое время, поэтому List ничего не показывает. Как я могу убедиться, что List отображает данные после обновления ustaList. Обычно swift делает это автоматически, но в данном случае не обновляется.

1 Ответ

1 голос
/ 20 июня 2020

Обязательно заключите оператор в 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()
        }
    }
    
}

Есть способ использовать это без операторов Group и if. Используйте id внутри оператора ForEach, чтобы он мог различать guish и обновлять представление, если изменения на @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()
        }
    }
    
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...