Firebase + swift检索用户数据

时间:2016-02-28 09:56:24

标签: ios swift firebase

我只是尝试从firebase为我的项目检索数据。例如,在UILabel中显示facebook用户名。我存储facebook用户数据,如enter image description here

然后使用以下方法检索数据:

let ref = Firebase(url:"https://<app-name>.firebaseio.com/users/facebook:10207213459687665/name")

ref.observeEventType(.Value, withBlock: { snapshot in

   self.facebookUserName.text = snapshot.value as! String

})

它工作得很好但是通过检索特定路径中的用户名非常愚蠢,因为这可能是不同的Facebook用户登录。

我正在考虑检查用户是否已登录并显示其名称或检查currentUser或更智能的方式来执行此操作? 我不知道该怎么做。

4 个答案:

答案 0 :(得分:2)

有100种不同的方法可以做到这一点;这里有几个

users
  user_id_0
    facebook_id: facebook:10207213459687665
    name: Nicholas
  user_id_1
    facebook_id: facebook:12346578912345689
    name: Frank
在上面的

中,您将查询所需的facebook_id,它将返回节点和所有子节点(名称,地址等)。 user_id_x是Firebase自动生成的节点名称(保证不同)

ref.queryOrderedByChild("facebook_id").queryEqualToValue("facebook:12346578912345689")
   .observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
    print(snapshot.value) //prints the facebook_id and Frank
})

另一种选择是使用相同的数据结构并观察该节点以加载数据。请记住,facebook id是节点的KEY,而不是值 - .value是键:值对。

let ref = Firebase(url:"https://<app-name>.firebaseio.com/users")
let thisUser = ref.childByAppendingPath("facebook:12346578912345689")

ref.observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in

   //snapshot will contain all of the child nodes
   let userName = snapshot.value.objectForKey("name")
   self.facebookUserName.text = userName

})

如果您只关心用户名,可以使用facebook id作为密钥来简化您的结构,值将是用户名:

users    
 fb_10207213459687665: Nicholas
 fb_12346578912345689: Frank

并使用上面的观察代码进行检索,除非您在初始问题中再次使用.value属性。

在这种情况下,.value属性是一个字符串,因为它是唯一的值(在您发布的结构中没有子节点,这可能会导致问题,因为它可能是一系列键:值对哪会崩溃)

查询会增加一些开销,因此观察效率更高。

答案 1 :(得分:0)

我在http://www.appcoda.com/firebase/

中找到了答案

当我们尝试从当前用户获取数据时,请在下方添加以下代码以存储uid(创建用户帐户时)

new_user = User.query.filter_by(email=posted_email).first()

分配变量:

NSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid")

实现功能代码:

var CURRENT_USER_REF: Firebase {
    let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String

    let currentUser = Firebase(url: "\(BASE_REF)").childByAppendingPath("users").childByAppendingPath(userID)

    return currentUser!
}

然后我们可以在直接路径中淘汰裁判。

答案 2 :(得分:0)

我遇到了同样的问题。为了解决这个问题,我创建了一个自动引用登录用户的变量:

class ViewController: UIViewController {
let UsersRef = Firebase(url:"https://<app-name>.firebaseio.com/users")

然后,在您尝试获取用户数据的@IBOutlet下,写下:

let LoggedInUser = UsersRef.childByAppendingPath("\(UsersRef.authData.uid)")

运行代码时,&#34; UsersRef.authData.uid&#34;由当前登录用户的特定ID自动替换。这应创建登录用户的数据库信息的直接路径,而无需在参考中手动输入用户ID。

答案 3 :(得分:0)

要检索Facebook用户的数据,我们可以使用FirebaseAuth的currentUser属性,该属性返回FIRUser,其中包含有关您用户的所有信息。读取所有用户数据后,您可以将其存储在任何地方,但出于本示例的目的,我使用了UserDefaults。

 import Firebase
 func getUserInformation()
        {
            let user = Auth.auth().currentUser
            if let user = user {
                UserDefaults.standard.setValue(user.displayName!, forKey: "Username")
                let uid = user.uid
                UserDefaults.standard.set(uid, forKey: "user_ID")
                let url = "http://graph.facebook.com/\(uid)/picture?type=square"
                UserDefaults.standard.set(url, forKey: "ImageData")
        }
    }