Получение результата из Firebase в SwiftUI с использованием @escaping
коллеги) есть класс. в нем происходит выкачка инфы с БД Firebase. дальше этот текст нужно вставить в Text в VStack. Есть такой код. К сожалению не работает - Text остается пустым(
Буду рад, если сможете подсказать)
class GetGarbageInfo {
func getInfo(path: String, completion: @escaping (String) -> Void) {
var result = ""
let rootReference = Database.database().reference()
let garbageReference = rootReference.child("GarbageInformation").child(path).child("body")
garbageReference.observeSingleEvent(of: .value) { (DataSnapshot) in
result = DataSnapshot.value as? String ?? "0"
}
completion(result)
}
}
UI:
struct ContentView: View {
let garbageInfo = GetGarbageInfo() /// initialize a `GetGarbageInfo` first
@State var result = ""
var body: some View {
VStack {
Text(result)
}.onAppear {
garbageInfo.getInfo(path: yourPath) { resultString in /// replace `yourPath` with your input
result = resultString
}
}
}
}
Спасибо!
Ответы (2 шт):
Автор решения: schmidt9
→ Ссылка
Попробуйте так, у вас вероятно результат возвращается раньше, чем приходят данные из базы данных
garbageReference.observeSingleEvent(of: .value) { (DataSnapshot) in
result = DataSnapshot.value as? String ?? "0"
completion(result)
}
Автор решения: Leonid Spiridonov
→ Ссылка
Вот так работает) может кому поможет. Ошибка была в том, что completion(result) нужно было вызывать в observeSingleEvent
Всем спасибо)
struct ContentView: View {
let garbageInfo = GetGarbageInfo()
@State var result = ""
var body: some View {
VStack {
Text(result)
}.onAppear {
garbageInfo.getInfo(path: yourPath) {
result = resultString
}
}
}
}
class GetGarbageInfo {
func getInfo(path: String, completion: @escaping (String) -> Void) {
var result = ""
let rootReference = Database.database().reference()
let garbageReference = rootReference.child("GarbageInformation").child(realPath).child("body")
garbageReference.observeSingleEvent(of: .value) { (DataSnapshot) in
result = DataSnapshot.value as? String ?? "0"
completion(result)
}
}
}