值事件如何在Firebase侦听器的更新中起作用?

时间:2019-05-31 03:19:55

标签: firebase firebase-realtime-database

事件侦听器是否保证曾经写入路径的所有数据最终都会传递给客户端? 例如,如果我有一个游戏客户端,它一个接一个地推动移动到同一路径,那么监听的客户端会收到所有更新吗? 在这种情况下会发生什么:客户端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适用于我的用途。

2 个答案:

答案 0 :(得分:0)

尝试使用此代码从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());
        }
    });

答案 1 :(得分:0)

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

  

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

如果在Firebase服务器有机会将状态发送给侦听器之前进行多次更新,则它可能会跳过一些中间值。因此,我们无法保证您的客户会看到每个状态的变化,只能保证它最终会看到最新的状态。

如果要确保所有客户端(可以)看到所有状态更改,则应将状态更改本身存储在数据库中。