我需要使用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)
}
您正在从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)
}