我正在在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);
}
}
});
}
}
我想知道是否有更好的方法来做我丢失的事情?我担心如果任务无法正常完成,我的排行榜就会混乱。我可以在一张快照中获得姓名和分数吗?
谢谢!
答案 0 :(得分:2)
您只能加载:
似乎您要尝试的是从多个根目录获得子节点的子集,这是不可能的。实际上,您似乎正在尝试进行联接,而在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。