当创建侦听器时,将调用Firestore“ ListenerRegistration”吗?

时间:2020-10-07 17:24:33

标签: c# firebase unity3d google-cloud-firestore listener

我在Firebase SDK中使用 Unity ,并使用了Firebase中的Auth和 Firestore 实用程序。

我可以从客户端对Firestore数据库进行各种操作,所以现在我尝试实现一些客户端挂钩,因此,当Firestore中的某些内容发生变化时,客户端将执行一个动作。

Firebase Documentation启发了我构建这些侦听器的方式,这是一个方法示例,用于在发生某些更改时将侦听器设置为Firestore集合:

//db == FirebaseFirestore.DefaultInstance;

public ListenerRegistration SetListenerToAllCollectionDocuments(string collectionID, Query query = null, Action OnSomeDocumentChange = null)
{
    try
    {
        Query colRef = query ?? db.Collection(collectionID);

        ListenerRegistration listener = colRef.Listen(colQuerySnapshot =>
        {
            Debug.Log("Listen changes on collection:" + collectionID);
            OnSomeDocumentChange();                
        });
        return listener;
    }
    catch (Exception e)
    {
        Debug.Log(e);
    }
    return null;
}

然后我可以这样称呼它:

ListenerRegistration listener = Database.SetListenerToAllCollectionDocuments("users", null, () => { Debug.Log("Something Change"); });

如果要禁用它,则具有侦听器引用。

到目前为止,很好,现在是问题: 当数据库中的某些内容发生更改时,将正确调用此侦听器,但是在设置侦听器时第一次调用方法SetListenerToAllCollectionDocuments();时会被 ALSO 调用。

这应该是预期的行为吗?

在我头上,仅当Firestore上的某些内容发生更改时才应调用此函数,而在我创建侦听器时则不应调用。我做错了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

当您附加侦听器时,应该使用集合/查询中的所有现有数据来调用侦听器。

如果只想获取新数据/更新,则需要在应用程序代码中确保这一点。常见的方法是在每个文档中添加一个lastUpdated时间戳,然后查询之后是lastUpdated的项目。