仅在与当前用户数据匹配时才获取用户数据
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 仅在模型记录属于经过身份验证的用户时才检索它们