Из-за асинхронных операций в вашем третьем операторе печати нет значения (пока).
Первые два оператора печати фактически выполняются после третьего оператора печати, даже если он не похож на него.Если вы создадите точки останова в каждом операторе печати, вы сможете увидеть порядок выполнения.
Таким образом, чтобы гарантировать, что данные возвращаются из 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
}
}