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

Posted

技术标签:

【中文标题】仅在与当前用户数据匹配时才获取用户数据【英文标题】:Fetch users data only if it matches current users data 【发布时间】:2016-12-08 11:44:17 【问题描述】:

我有一个 tableView 可以获取我的 Firebase 数据库中的所有用户。 tableView 单元格仅显示用户名、电子邮件和个人资料图像。问题是我还希望用户在用户节点的 UID 下存储一个属性键,该键将保存他们在应用程序中选择的属性数组(本例中的属性将是 ["food", "drink ", "sports"]) 并且我只想显示与当前登录用户具有 3 个或更多相同属性的用户。

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

第二个问题是我不知道如何获取新用户并将其添加到我的 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】:

首先。不要使用数组。它们是极端情景化的,通常还有其他更好的方法来存储数据。

第一个问题的答案:

给定一个 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)。

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

pizza_Camaro

然后您可以轻松检查属性的字符串是否相等。

另一个选项是递归查询。这是 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....

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

【讨论】:

以上是关于仅在与当前用户数据匹配时才获取用户数据的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在用户完成键入时才调用 angularjs ngChange 处理程序

Laravel 仅在模型记录属于经过身份验证的用户时才检索它们

如何仅在 ASP.NET MVC 中仅显示当前登录用户创建的项目

Rails 3,仅在用户登录时才呈现部分内容

当我重新加载页面值不会改变时,它们只在我登录时才会发生

Django 中的时区