2017-04-07 500 views
0

编辑,在底部更新,仅检索当前用户的子值仍然有问题从火力地堡


我已经存储了我的用户在火力地堡这样的 - 每个用户的值存储它们的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)我完全返回所有当前用户的值。我无法单独指定它们。

回答

0

它比你想象:-)

let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(FIRAuth.auth()?.currentUser?.uid) 
+0

嗯,这是我想要设置用户的价值,包括他们的UID的东西,用这个功能。他们注册了该应用,并将其值存储在Firebase中。然后当他们进入应用程序时,调用这个函数来设置他们的用户对象的信息。 – KingTim

+0

看到您的修改 - 这是所有3个答案推荐的相同方法,并导致崩溃。 – KingTim

+0

你确定用户已经登录,并且你有一个有效的uid值吗?如果孩子的钥匙是空白的,你会得到一个崩溃... – Russell

0

你需要另一个孩子添加到您的userRef

guard let uid = FIRAuth.auth()?.currentUser?.uid else { 
     return 
    } 

let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid) 
+0

我已经尝试过,但它导致崩溃 - 不知道为什么,崩溃带我到内存线程(?)屏幕。 – KingTim

0

首先获取当前用户的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) 

:-)

+0

我已经尝试过这种方法,它会导致崩溃。 – KingTim

0

以下是我做我的用户信息的负荷,

首先,我创建了一个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) 
} 

不知道如果这能帮助或不..

+0

我认为这通常是我正在尝试的,除非你不使用for循环,而是将快照转换为'[String:AnyObject]'。如果我尝试为uid添加一个子项,它一旦到达'observeSingleEvent'行就会崩溃。 – KingTim