Получение результата из 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)
        }   
    }
    
    }

→ Ссылка