首页 > 解决方案 > Firebase 实时数据库,在一张快照中获取不同位置的值

问题描述

我正在 Unity 项目中使用 Firebase 数据库。我读到您希望将数据库构建为尽可能平坦以提高性能,因此对于排行榜,我将其构建为这样

users
     uid
         name
     uid
         name
leaderboard
     uid
        score
     uid
        score

我想要一个可以获取此数据并在完成后触发回调的类。我在我的构造函数中运行它。

root.Child("leaderboard").OrderByChild("score").LimitToLast(_leaderboardCount).ValueChanged += onValueChanged;

为了用我写的数据触发回调。

void onValueChanged(object sender, ValueChangedEventArgs args)
{
    int index = 0;
    List<string> names = new List<string>();
    foreach (DataSnapshot snapshot in args.Snapshot.Children)
    {
            root.Child("players").Child(snapshot.Key).GetValueAsync().ContinueWith(task =>
            {
                if (task.Result.Exists)
                {
                    names.Add(task.Result.Child("name").Value.ToString());

                    index++;
                    if (index == args.Snapshot.ChildrenCount)
                    {
                        _callback(names);
                    }
                }
            });
        }
    }

我想知道是否有更好的方法来做到这一点,我错过了?我担心如果任务无序完成,我的排行榜会变得混乱。我可以在一张快照中获得姓名和分数吗?

谢谢!

标签: firebaseunity3dfirebase-realtime-database

解决方案


您只能加载:

  • 一个完整的节点
  • 单个节点下匹配某个条件的所有子节点的子集

看来您要做的是从多个根中获取子节点的子集,这是不可能的。实际上,您似乎正在尝试进行连接,这在 Firebase 上是您必须与客户端代码相关的事情。

请注意,加载后续节点通常比开发人员预期的要高效得多,因为 Firebase 通常可以通过管道传输请求(一切都通过单个 Web 套接字连接进行)。有关这方面的更多信息,请参阅http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786# 35932786


推荐阅读