获取 Firebase 用户中最小的孩子
Posted
技术标签:
【中文标题】获取 Firebase 用户中最小的孩子【英文标题】:Get youngest child in Firebase users 【发布时间】:2018-03-15 07:45:42 【问题描述】:我想在我的用户列表中找到最年轻的用户并加载他们的数据:姓名、个人资料图片和当前工作分配。我已阅读有关查询数据的 Firebase 入门,但他们的示例对我不起作用,因为我的数据组织方式不同。我有一个额外的子层。
这是我在 Firebase 中的 JSON 树:
我尝试加载用户列表,然后遍历它们以找到最年轻的用户,但这似乎有点过头了。 Firebase 文档让我觉得我应该能够通过 Firebase 方法进行查询,例如“queryOrderedByChild”或类似方法。
我已经查看了旧文档 here 和新文档 here,但我仍然不知道该怎么做。
这就是我的工作流程:
该应用会在“成员”列表中找到最年轻的用户,并加载他们的姓名、头像、生日等。他们将从工作列表中进行选择。一旦该用户从可用工作列表中进行选择,该应用就会从“成员”列表中加载下一个最年轻的用户,依此类推,直到所有用户都已加载并有机会选择工作。
我认为更好的工作流程是这样的:
-
利用 Firebase 查询获取最年轻的用户
使用该查询加载该用户(图像和名称)
我该怎么做呢?
编辑 #1:我尝试过的代码
func loadExistingUsers(completion: @escaping ([[String : Any]]) -> ())
var dictionary = [[String : Any]]()
ref.child("members").observeSingleEvent(of: .value) (snapshot: FIRDataSnapshot) in
for child in snapshot.children
let snap = child as! FIRDataSnapshot
if let value = snap.value as? [String : Any]
dictionary.append(value)
completion(dictionary)
然后在 ViewDidLoad 中:
loadExistingUsers (dictionary) in
var youngestBirthday = 19000101
var userName = "Sophie"
for item in dictionary
let fetchedBirthday = item["birthday"] as! Int
let fetchedName = item["firstName"] as! String
if fetchedBirthday > youngestBirthday
youngestBirthday = fetchedBirthday
userName = fetchedName
print(userName,youngestBirthday)
此方法返回我的用户列表中最年轻的用户,但要获得我想要的东西似乎还有很长的路要走。我必须首先从 Firebase 获取用户,然后解析快照,然后创建一个数组,然后对数组进行排序,然后获取用户名。我的印象是 Firebase 可以通过一个查询完成所有这些工作。我错了吗?
【问题讨论】:
你能展示你试过的代码吗? 已更新信息 请试试这个:ref.child("members").queryOrdered(byChild:"birthday").queryLimited(toFirst: 1).observe(.childAdded ....
并通过添加 print("Snapshot: \(snapshot)")
来查看快照中的内容
快照返回:Snapshot: Snap (Dad) birthday = 19780926; childParent = parent; firstName = Dad; gender = male; passcode = 1122; profileImageUrl = "https://firebasestorage.googleapis.com/...";
所以这是最小的孩子?
【参考方案1】:
您可以使用此代码获取最小的孩子:(因为您最小的日期是最大的数字,所以我使用toLast
)
ref.child("members").queryOrdered(byChild:"birthday").queryLimited(toLast: 1).observeSingleEvent(of: .childAdded, with: (snapshot) in
if let value = snapshot.value as? [String: Any]
let name = value["firstname"] as? String
//you can do for other values as well
print(name)
)
【讨论】:
完美。作品!与observe
方法相关的 query
让我感到困惑。现在我懂了。谢谢!以上是关于获取 Firebase 用户中最小的孩子的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 3 中包含字典的 Firebase 进程子快照