从 Firebase 数据库创建对象



我正在使用Firebase来存储用户记录。当用户登录时,我正在尝试拉取记录并创建一个用户对象以在视图控制器之间传递,而不是多次访问数据库。

class User: NSObject {
var name: String?
var email: String?
}

我的控制器中有一个变量myUser: User?,我想将从 Firebase 检索到的记录分配给该变量。

func retrieveUserWith(uid: String) {
Database.database().reference().child("users").child(uid).observe(.value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: Any] {
let user = User()
user.name = dictionary["name"] as? String
user.email = dictionary["email"] as? String
self.myUser = user
}
})
}

现在我明白了 firebase 调用是异步的,我无法直接将创建的用户分配给myUser变量,如上所示。

有没有另一种方法可以将user分配给myUser以避免每次切换视图控制器时都访问数据库?

这不是获取所需信息的正确方法。 Firebase 已经提供了用户的共享实例。

if let user = Auth.auth().currentUser {
let name = user.displayName // should check that this exists
let email = user.email // should check that this exists
}

尽管如此,要以您希望的方式实现这一目标:

class User: NSObject {
var name: String
var email: String?
static var sharedInstance: User!
init(name: String, email: String) {
self.name = name
self.email = email
}
}

对 firebase 的调用是异步的,因此您应该有一个 completionHandler,该处理程序将在调用结束时被调用:

func retrieveUserWith(uid: String, completionHandler: @escaping () -> ()) {
Database.database().reference().child("users").child(uid).observe(.value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: Any] {
let name = dictionary["name"] as? String ?? ""
let email = dictionary["email"] as? String ?? ""
let user: User = User(name: name, email: email)
User.sharedInstance = user
completionHandler()
}
})
}

然后,要在应用中的其他位置使用用户的共享实例,您可以执行以下操作:

if let user = User.sharedInstance {
// do stuff here
}

最新更新