Как создать и заполнить список SwiftUI данными Firebase? - PullRequest
0 голосов
/ 22 апреля 2020

Мне нужно создать список SwiftUI, используя отдельную строку из базы данных Firebase Realtime. Используя .observeSingleEvent, я успешно получил строку из базы данных, разделил ее и поместил в массив String. В настоящее время единственная проблема заключается в том, что я не могу заставить массив правильно принимать отдельное значение массива String, поскольку асинхронные данные c из Firebase не загружаются вовремя, чтобы представление подтвердило его. С какими ошибками я сталкиваюсь?

Спасибо.

@State var syList: [String] = ["1", "2", "3"]

func observeSymptomList(completion: @escaping ([String]) -> Void) {

    var symptomsArray: [String] = [""]

    let ref = Database.database().reference().child("symptoms")

    ref.observeSingleEvent(of: .value, with: { (snapshot) in

        if let value = snapshot.value as? String {
            print(value)
            symptomsArray = value.components(separatedBy: ", ")
            print(symptomsArray)
        }
        else { completion(["error"]) }

    }) { (error) in
        print(error.localizedDescription)}

    print(symptomsArray)
    completion(symptomsArray)
}

var body: some View {
    VStack {
        List {
            Section(header: ListHeader()) {
                ForEach(syList, id: \.self) {sy in
                    Text(sy)
                }
            }

        }.onAppear {
            self.observeSymptomList { (name) in
                self.syList = name
            }
        }
        .listStyle(GroupedListStyle())
    }
    .navigationBarTitle("Stil de viață")
    .navigationBarBackButtonHidden(true)
}

1 Ответ

0 голосов
/ 23 апреля 2020

Вы вызываете свой обработчик завершения, прежде чем получите данные из firebase. Вы должны поместить свой обработчик завершения после того, как вы присвоили значения symptomsArray следующим образом:

func observeSymptomList(completion: @escaping ([String]) -> Void) {
  var symptomsArray: [String] = [""]

  let ref = Database.database().reference().child("symptoms")

  ref.observeSingleEvent(of: .value, with: { (snapshot) in
    if let value = snapshot.value as? String {
      print(value)
      symptomsArray = value.components(separatedBy: ", ")
      completion(symptomsArray) // <-- move this statement here
      print(symptomsArray)
    }
    else { 
      completion(["error"]) 
    }
  }) { (error) in
    print(error.localizedDescription)}
    print(symptomsArray)
}
...