让Firebase用户中最小的孩子

时间:2017-10-04 02:12:36

标签: swift firebase firebase-realtime-database

我想在我的用户列表中找到最年轻的用户并加载他们的数据:名称,个人资料图片和当前的工作分配。我已经阅读了有关查询数据的Firebase初级读物,但他们的示例并不适用于我,因为我的数据组织方式不同。我有一个额外的子图层。

这是我在Firebase中的JSON树:

JSON tree

我已经尝试加载用户列表,然后迭代它们以找到最年轻的用户,但这似乎有些过分。 Firebase文档让我觉得我应该能够通过Firebase方法进行查询,比如查询订阅者和查询。或类似的。

我已经查看旧文档here和新文档here,但我仍然想知道该怎么做。

这是我的工作流程:

该应用程序将在"成员列表中找到最年轻的用户"并加载他们的名字,个人资料图片,生日等。他们将从工作列表中选择。一旦该用户从可用作业列表中选择,该应用程序将从"成员"列表中加载下一个最年轻的用户,依此类推,直到所有用户都已加载并且有机会选择作业。

我认为更好的工作流程是:

  1. 使用Firebase查询获取最年轻的用户
  2. 使用该查询加载该用户(图像和名称)
  3. 我将如何做到这一点?

    编辑#1:代码I<尝试

    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可以通过一个查询完成所有这些工作。我错了吗?

1 个答案:

答案 0 :(得分:1)

您可以使用此代码获得最小的孩子:(因为您最年轻的日期是最大的数字,因此我使用toLast

ref.child("members").queryOrdered(byChild:"birthday").queryL‌​im‌​ited(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)

                        }
                })