получить данные из базы данных не удалось - PullRequest
0 голосов
/ 21 апреля 2019

по какой-то причине, после того как я получил данные из базы данных, данные были успешно восстановлены.

    func retrieveData(user: User) {
        //let userID = Auth.auth().currentUser?.uid
        let email = user.emailAddress!
        // print(email)
        databaseRef?.child("userTable").child(email).observe(.value, with: { (snapshot) in
            // Get user value
            print("whats up ")
            if let value = snapshot.value as? [String:String] {
                let res = value["posts"]
                user.deserialize(data: res!)
                if( user === self.u1) {
                    print("they are same obj") // this will print, so they are pointing to the same address
                }
                print(self.u1.posts) // this also printed the things I want
            }
            // ...
        })
        if( user === self.u1) {
            print("they are same obj outside") // this also prints
        }
        print(self.u1.posts) // but once they exist closure, this one just become empty, as as user.posts
    }

Я действительно не понимаю, что здесь происходит.Кажется, что данные просто правильно хранятся после закрытия.Кроме того, я не знаю, почему код за пределами закрытия печатается первым.Огромное спасибо за любую помощь!

Это результат выполнения

они одинаковые obj за пределами [:]

что они такие же obj ["a @ hotmail 0": RadiUs.Post]

1 Ответ

0 голосов
/ 21 апреля 2019

Из-за асинхронных операций в вашем третьем операторе печати нет значения (пока).

Первые два оператора печати фактически выполняются после третьего оператора печати, даже если он не похож на него.Если вы создадите точки останова в каждом операторе печати, вы сможете увидеть порядок выполнения.

Таким образом, чтобы гарантировать, что данные возвращаются из Firebase, вам следует вызывать данные только здесь:

databaseRef?.child("userTable").child(email).observe(.value, with: { (snapshot) in
        // Manipulate data here
        }

Если вы предпочитаете, чтобы вызовы были синхронными, вы можете сделать следующее:

    func retrieveData(user: User) {
    //let userID = Auth.auth().currentUser?.uid
    let email = user.emailAddress!
    // print(email)
    databaseRef?.child("userTable").child(email).observe(.value, with: { (snapshot) in
        // Get user value
        print("whats up ")
        if let value = snapshot.value as? [String:String] {
            let res = value["posts"]
            user.deserialize(data: res!)
            if( user === self.u1) {
                print("they are same obj") // this will print, so they are pointing to the same address
            }
            print(self.u1.posts) // this also printed the things I want
        }
        // ...
    })
    if( user === self.u1) {
        print("they are same obj outside") // this also prints
    }
    DispatchQueue.main.async{
        print(self.u1.posts) // Now called sequentially 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...