从火力地堡
编辑,在底部更新,仅检索当前用户的子值仍然有问题从火力地堡
我已经存储了我的用户在火力地堡这样的 - 每个用户的值存储它们的UID下(FIRAuth.auth()?.currentUser?.uid
):
"users" : {
"tzfHgGKWLEPzPU9GvkO4XE1QKy53" : {
"gender" : "male",
"handle" : "TestHandle2",
"name" : "Timothy",
"profilePicture" : "https://graph.facebook.com/*removed*/picture?type=large&return_ssl_resources=1"
}
}
我们获得用户的信息(将其设置为我User
对象周围的应用程序中使用),我有这样的功能:
func getUserInfo() {
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users")
// How to get specific user (current user only)??
userRef.observeSingleEvent(of: .value, with: { (snapshot) in
let users = snapshot.value as! [String: Dictionary<String, String>]
for (key, value) in users {
guard let name = value["name"] else {print("Error getting user name"); return}
guard let handle = value["handle"] else {print("Error getting user handle"); return}
guard let gender = value["gender"] else {print("Error getting user gender"); return}
guard let profilePicture = value["profilePicture"] else {print("Error getting user profilePicture"); return}
print("\n\nName: \(name)\nHandle: \(handle)\nGender: \(gender)\nProfile Picture: \(profilePicture)\n\n")
}
})
}
但是,这会返回数据库中所有用户的值 - 我只想获取当前用户的值。
我可以添加/更改此功能以确保它仅检索当前用户的值,而不是所有用户?另外(如果有必要,我可以提出一个单独的问题,但这似乎与此有关),这种将每个用户的值存储为其UID子项的结构是一种很好的方法吗?我注意到其他示例中的很多时间都是以childByAutoId
存储的。我不确定会有什么优势。
感谢您的帮助!
编辑:
如果我添加另一个孩子(UID)的参考结束再投作为[String : AnyObject]
字典,我可以得到当前用户的价值,但解析它似乎是一个问题。
func getUserInfo() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid)
self.currentUser?.uid = uid
userRef.observeSingleEvent(of: .value, with: { (snapshot) in
if let usersDict = snapshot.value as? [String : AnyObject] {
print(usersDict)
for user in usersDict {
// guard let name = user.value(forKey: "name") else {print("Error getting user name"); return}
// guard let handle = user.value(forKey: "handle") else {print("Error getting user handle"); return}
// guard let gender = user.value(forKey: "gender") else {print("Error getting user gender"); return}
// guard let profilePicture = user.value(forKey: "profilePicture") else {print("Error getting user profilePicture"); return}
// print("\n\nName: \(name)\nHandle: \(handle)\nGender: \(gender)\nProfile Picture: \(profilePicture)\n\n")
}
}
})
}
我得到每个user.value(forKey)
线的错误,指出“不能调用非功能型AnyObject的价值。”
如果我在循环内我print(user.value)
我完全返回所有当前用户的值。我无法单独指定它们。
它比你想象:-)
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(FIRAuth.auth()?.currentUser?.uid)
你需要另一个孩子添加到您的userRef
guard let uid = FIRAuth.auth()?.currentUser?.uid else {
return
}
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid)
我已经尝试过,但它导致崩溃 - 不知道为什么,崩溃带我到内存线程(?)屏幕。 – KingTim
首先获取当前用户的UID,
let currentUid = FIRAuth.auth()?.currentUser?.uid
然后替换这个数据库引用,
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users")
与此,
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(currentUid)
:-)
我已经尝试过这种方法,它会导致崩溃。 – KingTim
以下是我做我的用户信息的负荷,
首先,我创建了一个NSObject类称为用户...
import UIKit
class User: NSObject {
// Add Whatever Child values of the user you have here
var email: String?
var nickname: String?
}
然后我打电话
func GetUserInfo() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {
return
}
FIRDatabase.database().reference().child("users").child(uid)
.observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let user = User()
user.setValuesForKeys(dictionary)
print(user.nickname!)
}, withCancel: nil)
}
不知道如果这能帮助或不..
我认为这通常是我正在尝试的,除非你不使用for循环,而是将快照转换为'[String:AnyObject]'。如果我尝试为uid添加一个子项,它一旦到达'observeSingleEvent'行就会崩溃。 – KingTim
嗯,这是我想要设置用户的价值,包括他们的UID的东西,用这个功能。他们注册了该应用,并将其值存储在Firebase中。然后当他们进入应用程序时,调用这个函数来设置他们的用户对象的信息。 – KingTim
看到您的修改 - 这是所有3个答案推荐的相同方法,并导致崩溃。 – KingTim
你确定用户已经登录,并且你有一个有效的uid值吗?如果孩子的钥匙是空白的,你会得到一个崩溃... – Russell