Firebase является асинхронным, и self.user = defaultUser в первом блоке кода будет вызываться еще до того, как Firebase сможет вернуть данные.
Данные действительны ТОЛЬКО в закрытии после вызова Firebase,Вот как это исправить.Да, и удалите этот код ошибки, так как он не нужен.
Предположим, что такая структура пользователя
users
uid_0
name: "some name"
email: "some email"
и код для чтения в uid_0 и заполнение глобального (т. Е. Класса var) user
class MyUser {
var uid = ""
var name = ""
var email = ""
init(aUid: String, aName: String, aEmail: String) {
self.uid = aUid
self.name = aName
self.email = aEmail
}
}
var user: MyUser!
func readOneUser() {
let uid = "uid_0"
let thisUserRef = self.ref.child("users").child(uid)
thisUserRef.observeSingleEvent(of: .value, with: { snapshot in
//let uid = snapshot.key if you don't know the uid, it will be the key to the node
let name = snapshot.childSnapshot(forPath: "name").value as? String ?? "No Name"
let email = snapshot.childSnapshot(forPath: "email").value as? String ?? "No Email"
self.user = MyUser(aUid: uid, aName: name, aEmail: email)
print(self.user.name) //do something with the user here
})
}
, и эту строку
defaultUser.image = UIImage(named: value?["image"] as? String ?? "")!
необходимо рассмотреть, но я не знаю, что это за намерение.Если это произойдет, это может привести к нулю
defaultUser.image = UIImage(named: "")!
, поэтому вы можете заполнить его каким-либо образом по умолчанию или обеспечить обработку ошибок, если оно равно нулю.