为了获得简单的高分,在Unity项目中使用Firebase时,我偶然发现了执行查询时遇到的问题。在编辑器中,一切都像超级按钮一样工作(编辑器没有持久性)在设备(启用持久性)上,麻烦开始了。查询显示的是缓存的Firebase数据,因此仅在客户端首次调用时才是正确的,然后在Firebase认为适合同步时才正确(可能永远不会,因为没有事件处理程序)
但是,在寻找解决方案时,没有办法强制更新缓存的值。然后,我在查询中使用KeepSynced(true)进行了测试,这似乎可行:
this.HiscoreQuery = hiscoreref.OrderByChild ("Score").LimitToLast (20);
this.HiscoreQuery.KeepSynced(true);
this.HiscoreQuery.GetValueAsync().ContinueWith (task => {
if (task.IsFaulted) {
Debug.LogError ("Get hiscores faulted");
return;
}
if (task.Result != null && task.Result.ChildrenCount > 0) {
Debug.Log ("Get hiscore data success!");
this.AddDelayedUpdateAction (() => this.OnGetHiScores (task.Result));
}
});
问题:虽然如果Firebase仅侦听查询的LImitToLast(20)会很好,但是如果Firebase在内部将每个复制的(不断增长的)hiscorelist复制到每个客户端中,那将是一件非常糟糕的事情。
有谁知道KeepSynced(true)
是限于实际查询范围还是整个树/分支?以及如何验证这一点?
GetValue
呼叫不适用于KeepSynced(true)
。Firebase会急切地从缓存中返回值,然后才从服务器加载数据。
有关详细说明,请在此处查看我的答案:Firebase脱机功能和addListenerForSingleValueEvent
如果要使用缓存,请使用侦听器而不是GetValue
调用。使用侦听器,您的回调将被触发两次(如果有更改):一次使用来自缓存的值,然后一次使用来自服务器的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句