【问题标题】:Firebase + swift retrieving user dataFirebase + 快速检索用户数据
【发布时间】:2016-02-28 09:56:24
【问题描述】:

我刚刚尝试从我的项目的 firebase 中检索数据。例如,在 UILabel 中显示 facebook 用户名。我像这样存储 facebook 用户数据

然后使用检索数据:

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 或任何更聪明的方法来做到这一点? 我不知道该怎么做。

【问题讨论】:

  • 从 firebase 获取数据的方式并不愚蠢。实际上,我会做与您现在正在做的完全相同的事情来获取用户名。我认为您的问题不在于从 firebase 获取用户数据,而是您对在用户登录时将用户的 facebook ID 放在哪里感到困惑。
  • 您的意思是要为该用途添加一个用户 ID 并通过他们的用户 ID 检索数据吗?我认为应该有一种“更聪明”的方式来做到这一点。
  • 以后,请从 Firebase 复制并粘贴您的数据结构,而不是图片,这样我们就不必重新输入了。 :-)
  • 这确实不是一个易于扩展的数据结构。例如,如果您想在他们的节点中存储有关用户的其他信息怎么办?喜欢他们最喜欢的食物。然后 Snapshot.value 成为一个带有键值对的字典(名称:Nicholas,食物:披萨)。请参阅我的答案以了解几种可能性。
  • 很抱歉没有上传结构。在这种情况下,我怎样才能拥有更好的数据结构?在其中添加 user_id ?

标签: ios swift firebase


【解决方案1】:

有 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 属性是一个字符串,因为它是唯一的值(在您发布的结构中没有子节点,这可能会导致问题,因为它可能是一系列会崩溃的键:值对)

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

【讨论】:

  • 非常感谢您回答我的问题,但我有一个问题。现在我们实现这个代码,因为我们知道 facebook_id 是“facebook:12345xxxxxxx”。我只是想知道我们能否检索 当前用户 用户名。
  • 所有三个示例都返回当前用户名。请记住,当用户对 Firebase 应用进行身份验证时,会发生三件事。 1) 在客户端设备上的回调中返回有关用户的信息 2) 返回的用户信息包含一个 uid(唯一 ID)3) 已定义应用程序的安全和 Firebase 规则中的 auth 变量的值。因此,一旦经过身份验证,您就有了用户的 uid,然后可以使用该 uid 从您的 /users 节点获取他们的信息。
  • 但是每个用户都有不同的“facebook:123456xxxxxx”对吗?它如何与不同的用户一起工作。如果我有 10 多个甚至更多用户怎么办??
  • 当用户进行身份验证时,您的应用将收到通知,并且 firebase auth 变量将填充该用户 uid。然后,您可以查询您的 /users 节点等以获取他们的信息。
【解决方案2】:

我在http://www.appcoda.com/firebase/找到了答案

当我们试图从当前用户获取数据时,在下面添加此代码来存储 uid(创建用户帐户时)

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!
}

函数的实现代码:

<reference>.observeEventType(FEventType.Value, withBlock: { snapshot in

        let currentUser = snapshot.value.objectForKey("username") as! String
        <--your code-->
        print("Username: \(currentUser)")
        self.currentUsername = currentUser
        }, withCancelBlock: { error in
            print(error.description)
    })
}

然后我们可以在直接路径中废弃 ref。

【讨论】:

    【解决方案3】:

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

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

    然后,在您尝试显示用户数据的@IBOutlet 下,写入:

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

    当您运行代码时,“UsersRef.authData.uid”会自动替换为当前登录用户的特定 ID。这应该会创建登录用户的数据库信息的直接路径,而无需手动输入参考中的用户 ID。

    【讨论】:

      【解决方案4】:

      要检索 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")
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 2011-02-09
        • 1970-01-01
        相关资源
        最近更新 更多