по какой-то причине после того, как я получил данные из firebase, данные были успешно получены.
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
}
Я действительно не понимаю, что здесь происходит. Кажется, что данные просто хранятся правильно после закрытия. Кроме того, я не знаю, почему сначала печатается код вне закрытия. Большое спасибо за любую помощь!
Это ходовой результат
они такие же объекты снаружи [:]
Как дела они одинаковые объекты ["a@hotmail 0": RadiUs.Post]





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