【问题标题】:Firebase keepsyncedFirebase 保持同步
【发布时间】:2020-01-16 20:20:40
【问题描述】:

在 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 只监听 Query 的 LImitToLast(20) 这可能没问题,但如果 Firebase 在内部将整个(不断增长的) hiscorelist 复制到每个客户端,那将是一件非常糟糕的事情。

有谁知道KeepSynced(true) 是否仅限于实际查询范围或整个树/分支?如何验证这一点?

【问题讨论】:

    标签: c# firebase unity3d firebase-realtime-database


    【解决方案1】:

    GetValue 调用不适用于KeepSynced(true)。 Firebase 急切地从缓存中返回值,然后才从服务器加载数据。

    如需更详细的解释,请在此处查看我的回答:Firebase Offline Capabilities and addListenerForSingleValueEvent

    如果你想使用缓存,use listeners 而不是GetValue 调用。使用侦听器,您的回调将被触发两次(如果有更改):一次使用缓存中的值,然后一次使用来自服务器的值。

    【讨论】:

    • 谢谢弗兰克,我会再试一次。我可以用这个例子来说明差异: String source = querySnapshot.getMetadata().isFromCache() 吗? “本地缓存”:“Firebase 服务器”;
    • 我意识到我不能这样做,因为它只有在数据发生变化时才有效。我现在所做的是添加一个侦听器,然后对更新数据一次或多次做出反应。当我对此进行测试时,我意识到事件监听器将在所有拥有它的客户端上处于活动状态。如果您将其扩展到可能拥有数千名用户的手机游戏,这可能会影响您的 Firebase 发票;)实际上,我会在几秒钟、2 或 3 秒钟后移除监听器,以便在不需要时停止获取新闻。
    • isFromCache 是 Firestore API,而 KeepSynced 是实时数据库的一部分。虽然这两个数据库都是 Firebase 的一部分,但它们是完全独立的,并且有自己的 API。
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多