【问题标题】:snapshot listener isFromCache() returning false快照侦听器 isFromCache() 返回 false
【发布时间】:2020-02-20 13:52:31
【问题描述】:

我正在我的文档参考中注册快照侦听器。第一次,我得到元数据 isfromCache 为真,其他时候我得到假。它应该相反,因为没有文档正在更改。我检查了这个值只是为了确保我第一次读取后的数据是从缓存中读取的。

DocumentReference basicRef = usersRef.collection(DETAILS).document(BASIC_DETAILS);
ListenerRegistration basicListener = basicRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
            @Override
            public void onEvent(@Nullable DocumentSnapshot snapshot,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    return;
                }

                if (snapshot != null && snapshot.exists()) {
                    Log.d("debug", "Current data basic: " + snapshot.getMetadata().isFromCache());
                    BasicDetails basicDetails = snapshot.toObject(BasicDetails.class);
                    loadData(basicDetails);
                } else {
                    Log.d("debug", "Current data: null");
                }
            }
        });

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    isFromCache 属性记录为:

    true 如果快照是根据缓存数据创建的,而不是保证最新的服务器数据

    所以false 并不一定意味着该文档是从服务器读取的,而是意味着该文档保证与服务器是最新的。

    要知道哪些文档发生了变化,可以遍历 documentChanged 集合,如上面的代码所示。

    另见:

    【讨论】:

    • 好的,知道了。模糊地说,True 表示旧缓存,False 表示服务器或更新的缓存。非常感谢你做的这些。所以在我的情况下发生的事情可能是它第一次从缓存中获取数据,认为它是旧的。然后它与服务器检查确认它是新的,然后在更新缓存时显示 false。
    • 是的,这个名字绝对不直观。如果您最初收到false,则很可能是与服务器的连接尚未产生数据,它会为您提供该数据的本地版本(以便您可以尽快显示 UI)。如果你不想要这个本地版本,你可以告诉 Firebase 不要返回那些(查看文档以了解如何)。但我通常不建议这样做,因为快速显示 UI 要好得多。如果需要,您可以显示一些数据可能已过时(例如,通过显示它闪烁,直到您获得isFromCache 为假的快照)。
    • 不行,我只能这样。我想快速加载 UI。我只是想确保我不是每次都从服务器读取数据。感谢您的见解!
    猜你喜欢
    • 2021-04-07
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多