仅当用户数据与当前用户数据匹配时才获取用户数据

时间:2016-12-08 11:44:18

标签: arrays swift uitableview firebase firebase-realtime-database

我有一个tableView,用于获取Firebase数据库中的所有用户。 tableView单元格只显示用户名,电子邮件和个人资料图像。问题是我还希望用户在用户节点中的UID下存储一个属性密钥,该属性密钥将包含他们在应用程序中选择的属性数组(此示例中的属性将是[“food”,“drink” “,”sports“])我希望只显示与当前用户签名具有3个或更多相同属性的用户。

第一个问题是我不知道如何在我的UID下向我的firebase数据库添加一个属性数组,因为它保存为一个属性节点,其中包含从索引0到索引2的列表(3个键0, 1,2)用字符串“食物”,“饮料”,“运动”。我也不知道这是否是最佳方式。任何帮助将不胜感激。

第二个问题是我不知道如何获取新用户并将其添加到我的tableView中仅用户具有与当前用户相同的属性。 以下是我当前获取所有用户的代码,没有任何过滤

func fetchUser() {
        FIRDatabase.database().reference().child("users").observe(.childAdded, with: { (snapshot) in

            if let dictionary = snapshot.value as? [String: AnyObject] {
                let user = User()

                user.setValuesForKeys(dictionary)

                self.users.append(user)



         DispatchQueue.main.async(execute: { 
                    self.tableView.reloadData()
                })
            }

        }, withCancel: nil)
    }

class User: NSObject {

    var name: String?
    var email: String?
    var numberId: String?

    var attributes: String?

    var password: String?
    var profileImageUrl: String?
}

1 个答案:

答案 0 :(得分:1)

首先。不要使用数组。它们非常具有情境性,通常还有其他更好的方法来存储数据。

回答第一个问题:

考虑到要存储用户数据和某些属性的Firebase结构,这里有一个可以执行此操作的结构

users
  uid_0
    name: "Frank"
    attribs
      fav_food: "Pizza"
      fav_car: "Camaro"

并阅读上述节点

usersRef.observe(.value, with: { snapshot in

    for child in (snapshot?.children)! {
        let snap = child as! FDataSnapshot 
        let dict = snap.value as! [String: AnyObject] 

        let name = dict["name"] //it's Frank

        let attribs = dict["attribs"] as! [String: AnyObject]
        let food = attribs["fav_food"] //pizza
        let car = attribs["fav_car"] //camaro
    }
}

回答第二个问题:

  

第二个问题是我不知道如何获取新用户   将它添加到我的tableView只有用户具有相同的属性   当前用户。这是我当前获取所有用户的代码,   没有任何过滤:

所以你要问的是如何找到与当前用户具有相同属性的其他用户。

Firebase没有能力对多个孩子进行比较(即没有:食物= =披萨和汽车= Camaro)。

一种选择是将attribs存储为字符串

pizza_Camaro

然后你可以轻松检查attribs'字符串相等。

另一个选项是递归查询。这是10k英尺水平的想法

query for all users where fav_food is pizza
   query from that set of users where fav_car is Camaro
      query from that set of users where....

你明白了。它不是超级高效的,但对于小型数据集,它可以工作。