如何使用Firebase数据创建和填充SwiftUI列表?

问题描述 投票:0回答:1

我需要使用Firebase实时数据库中的分隔字符串来构建SwiftUI列表。使用.observeSingleEvent,我成功地从数据库中获取了字符串,将其分离并放入了String数组中。目前,唯一的问题是我无法使数组正确地使用分离的String数组值,因为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)
}
ios swift firebase firebase-realtime-database swiftui
1个回答
0
投票

您正在从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)
}
© www.soinside.com 2019 - 2024. All rights reserved.