我正在尝试将聊天功能添加到我的应用程序中,而我试图做的就是在加载一些旧消息后收听其他用户发送的消息。
一切正常,而且我知道一个事实,每当添加新文档时,firebase都会下载该文档并将其与缓存的数据一起添加,然后触发侦听器。
当然,您必须增加限制,否则,如果用户聊天几个小时,您最终将获得数百或数千条缓存的消息,而只显示1条新消息。
因此,假设我们增加了50个限制(我将解释为什么设置为50),这样每当其他用户发送新消息时,我们就会收到1条新消息和49条我们将忽略的缓存消息。
好的,一切都可以像这样正常工作,但是如果我们离线并且其他用户发送消息怎么办?如果其他用户在离线状态下发送了10条消息,那么我们将重新上线,侦听器将被触发,我们将下载10条新消息以及40条缓存的消息,如果该用户在离线状态下发送了55条消息怎么办?好,当我们返回在线状态时,我们将仅下载50条新消息,而不会下载其余5条消息,这是我的问题。
我可以简单地取消限制,但是如果用户有成千上万条缓存的消息,那么每次发送新消息(我认为这确实效率很低)时,我都必须遍历它们,最好的解决方案是只获得每当触发侦听器时新添加的消息,我现在使用的50个限制只是一个简单的解决方法,不适用于所有状态。
答案 0 :(得分:1)
如果我们离线时用户发送了55条消息怎么办?好,当我们返回在线状态时,我们将仅下载50条新消息,而不会下载其余5条消息,这是我的问题。
当我们谈论很多消息时,我们不仅在限制查询。正如您已经注意到的那样,如果该限制小于脱机时收到的消息数,则您将仅下载与您的限制相等的消息数。在这种情况下,我们使用pagination。因此,最好的选择是在第一个查询中使用限制(limit(50)
),并在后续查询中使用最后一个可见文档。这样,当用户滚动时,他现在可以下载如果我们仅使用了limit(50)
调用就看不到的那5条消息。
编辑:
如果使用快照侦听器,您仍然可以这样做。检查一下:
db.collection("yourColl").document("yourDoc").addSnapshotListener(new DocumentListenOptions().includeMetadataChanges(), new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(DocumentSnapshot snapshot, FirebaseFirestoreException e) {
System.out.println("isFromCache: " + snapshot.getMetadata().isFromCache());
}
});
答案 1 :(得分:0)
您可以在文档中添加另一个字段,以跟踪此消息是新消息,已接收消息还是已阅读消息。那么您可以查询所有这些新消息,包括非限制的非新消息。 您将进行两个这样的查询。但这将起作用。或者甚至可以降低非新限制。