我在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上的某些内容发生更改时才应调用此函数,而在我创建侦听器时则不应调用。我做错了什么?谢谢。
答案 0 :(得分:1)
当您附加侦听器时,应该使用集合/查询中的所有现有数据来调用侦听器。
如果只想获取新数据/更新,则需要在应用程序代码中确保这一点。常见的方法是在每个文档中添加一个lastUpdated
时间戳,然后查询之后是lastUpdated
的项目。