我可以从firebase中获取用户数据,但是无法将用户数据输入到全局变量中。
Database.database().reference().child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
// Get user value
let value = snapshot.value as? NSDictionary
let username = value?["username"] as? String ?? ""
let userDigit = value?["lastDigit"] as? String ?? ""
let userDate = value?["babyDate"] as? String ?? ""
print(username)
print(userDigit)
print(userDate)
self.user.userName = username
self.user.userDigit = userDigit
self.user.userDate = userDate
}) { (error) in
print(error.localizedDescription)
}
print(self.user.userName)
print(self.user.userDigit)
print(self.user.userDate)
从上面的代码中,我可以看到用户名,userDigit,userDate,但是,在将数据输入到包含3个字符串变量的用户类中之后,我无法打印用户类的值。
具体来说,
打印(self.user.userName)
此代码返回nil。
如何输入数据?
答案 0 :(得分:1)
self.user.userName
的值为nil
,因为您是在观察者闭包之外调用它的。
在分配闭包后打印值并不能保证此后立即可用。
因为从Firebase提取数据后会调用observeSingleEvent
的闭包。
从Firebase成功获取数据后,您应该修改逻辑并尝试访问user
的值。
下面是一个示例代码,可以帮助您理解概念:
func getUser(with userID: String, completion: @escaping ((_ user: User) -> Void)) {
Database.database().reference().child("users").child(userID).observeSingleEvent(of: .value) { (snapshot) in
// Get user value
let value = snapshot.value as? [String: Any]
let username = value?["username"] as? String ?? ""
let userDigit = value?["lastDigit"] as? String ?? ""
let userDate = value?["babyDate"] as? String ?? ""
var user = User()
user.userName = username
user.userDigit = userDigit
user.userDate = userDate
DispatchQueue.main.async {
completion(user)
}
}
}
在上述方法中,我们从firebase中获取数据,并在数据可用后将其返回到我们自己的闭包中。 然后像这样调用上面的函数:
self.getUser(with: userID!) { (user) in
// the user object inside the closure will be available after fetching data from firebase
print(user.userName)
print(user.userDigit)
print(user.userDate)
}
希望这会有所帮助