【问题标题】: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?
}

【问题讨论】:

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


    【解决方案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....
    

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

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      相关资源
      最近更新 更多