【问题标题】:How does the value event work on updates with Firebase listeners?值事件如何处理 Firebase 侦听器的更新?
【发布时间】:2019-05-31 03:19:54
【问题描述】:

事件侦听器是否保证曾经写入路径的所有数据最终都会传送到客户端? 例如,如果我有一个游戏客户端一个接一个地将移动推送到同一路径,监听客户端会收到所有更新吗? 在这种情况下会发生什么:客户端 A 将移动 1 推送到客户端 B 正在侦听的 game1/user1/move_data;客户端 A 然后立即推送另一个移动,更新 game1/user1/move_data 的值。 是否保证监听客户端收到所有推送的动作?

目前我有一个系统,每次移动都会创建一个新路径,然后我在每次移动时调用单个侦听器,因为每个客户端在其状态下到达该移动。好像客户端 A 接收到客户端 B 所做的最新移动,然后客户端 A 开始侦听尚不存在的路径,这似乎效率不高。

以下引用来自此链接:https://firebase.google.com/docs/database/admin/retrieve-data

" value 事件用于读取给定数据库路径中内容的静态快照,因为它们在读取事件时就存在。它与初始数据一起触发一次,并在每次数据更改时再次触发。事件回调传递一个包含该位置所有数据的快照,包括子数据。在上面的代码示例中,value 返回了您应用中的所有博客文章。每次添加新博客文章时,回调函数将返回所有帖子。”

在读取事件发生时它们存在的部分让我认为,如果侦听器在路径上,那么客户端最终将收到该路径上的所有值。

我正在努力破译的保证部分中的这一行:

“值事件总是最后触发,并保证包含在拍摄快照之前发生的任何其他事件的更新。”

我正在使用一种没有基于 Google 的 sdk 的语言并提出这个问题,因此我可以进一步评估 Firebase 是否适合我的使用。

【问题讨论】:

  • 我运行了一些测试,似乎所有更新都在客户端收到。我没有发布答案,因为我不知道为什么会这样。如果连接丢失也一样吗?如果有人在该路径上侦听或多个客户端在该路径上侦听并且它们断开连接,Google 是否会将更新之前的先前值传递给另一个工作人员?

标签: firebase firebase-realtime-database


【解决方案1】:

Firebase 实时数据库执行状态同步。如果客户端正在侦听某个位置的数据,它将接收该数据的状态。如果数据发生变化,它将接收该数据的最新状态。

...如果我有一个游戏客户端一个接一个地将移动推送到同一路径,监听客户端会收到所有更新吗?

如果在 Firebase 服务器有机会将状态发送到侦听器之前进行了多次更新,它可能会跳过一些中间值。所以不能保证你的客户端会看到每一个状态变化,只能保证它最终会看到最新的状态。

如果您想确保所有客户端(可以)看到所有状态更改,您应该将状态更改自己存储在数据库中。

【讨论】:

    【解决方案2】:

    尝试使用此代码从 firebase 数据库获取更新值:-

     mFirebaseInstance = FirebaseDatabase.getInstance();
        mFirebaseDatabase = mFirebaseInstance.getReference();
    
        mFirebaseDatabase.child("new_title").setValue("Realtime Database");
        mFirebaseDatabase.child("new_title").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String appTitle = dataSnapshot.getValue().toString();
                Log.e("Hey", appTitle);
                title.setText(appTitle);
            }
    
            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.e("Hey", "Failed to read app title value.", error.toException());
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多