firebase - 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);
}
}
});
}
}
我想知道是否有更好的方法来做到这一点,我错过了?我担心如果任务无序完成,我的排行榜会变得混乱。我可以在一张快照中获得姓名和分数吗?
谢谢!
解决方案
您只能加载:
- 一个完整的节点
- 单个节点下匹配某个条件的所有子节点的子集
看来您要做的是从多个根中获取子节点的子集,这是不可能的。实际上,您似乎正在尝试进行连接,这在 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。
推荐阅读
- javascript - 将 Firebase Props onclick 传递给 Vue 中的方法
- reactjs - React:为什么我们在 setState 中有回调?
- javascript - 如何使用 laravel 重定向到 adminlte 上的特定选项卡
- spring - 如何在springboot的ClientHttpRequestInterceptor中使用Autowired注解
- php - 在 API 调用中重构长 url
- ios - 表格视图滚动后动画图像消失
- visual-c++ - 工具栏正在重新排列
- javascript - 无法在 WebStorm 中为量角器创建调试配置
- javascript - eslint object-curly-newline 冲突更漂亮的多行基本原理
- mysql - 获得基于年份的畅销产品