获取本地缓存有巨大延迟

问题描述 投票:0回答:1

如果在 React Native 上使用我的 Android 应用程序时互联网连接丢失,我会尝试强制 Firebase 使用缓存中的数据。

这个想法是,当用户打开屏幕时,他会看到一个组列表。这些组存储在 Firestore 中。

如果有互联网连接,那就没有问题。但是,如果我关闭

emulator
上的互联网,那么使用缓存就会变得非常奇怪。

我在做什么和我看到什么::

  1. 我关掉互联网
  2. 转到另一个应用程序屏幕。
  3. 我和小组一起回到屏幕。我希望看到立即从缓存中下载的组。相反,我等待 10 秒后组出现。
  4. 我重复步骤2-3,但这次需要等待大约一分钟。
  5. 我再次重复步骤2-3,但这一次需要等待大约8分钟。
  6. 再次重复后,我等了大约5分钟。

一直以来我都没有在模拟器上打开互联网。因此组列表已从缓存中返回。但为什么要花这么长时间呢? 请注意,我在

.get({source: 'cache'})
中专门设置了缓存的使用。

组件代码:

  const fetchGroups = async () => {
    const grps = await firebaseConnector.getGroups();
    try {
      Alert.alert(`${grps.length}`);
    } catch (error) {
      Alert.alert('error');
    }
    setGroups([...grps]);
  };

  useFocusEffect(
    useCallback(() => {
      fetchGroups();
    }, []),
  );

FirebaseConnector 方法:

  async getGroups(): Promise<GroupItem[]> {
    try {
      var groupsItems: GroupItem[] = [];
      const grpsPartSnapshot = await firestore()
        .collection('GroupParticipants')
        .where('UserId', '==', this.userId)
        .get({source: 'cache'});

      const grpsIds = grpsPartSnapshot.docs.map(x => x.data().GroupId);
      for (const grpIndex in grpsIds) {
        var grpId = grpsIds[grpIndex];
        var grpInfo = await firestore()
          .collection('Groups')
          .doc(grpId)
          .get({source: 'cache'});

        groupsItems.push({
          id: grpInfo.id,
          name: grpInfo.data()?.Name,
          imageSource: grpInfo.data()?.Image,
        });
      }
      return groupsItems;
    } catch (error) {
      console.error(error);
      return [];
    }
  }

UPD

我注意到行为会根据我来自哪个屏幕而变化。如果我从空白屏幕进入,组会立即从缓存中按预期显示。

如果我从显示 Firestore 中其他信息的屏幕截图开始(由于某种原因总是没有问题),那么我会观察到上面的行为。

UPD2

我准备了一些动画以使其更清晰......

有互联网连接>>>

https://imgur.com/mxsAZcp

没有互联网连接>>>

https://imgur.com/gP8O19L

android firebase react-native google-cloud-firestore
1个回答
0
投票

我想我已经认识到自己的错误了。

问题在于,即使没有连接,某些方法也会首先使用

.get({source: 'server'});
进行调用。

之后,调用带有

.get({source: 'cache'})
的方法;

© www.soinside.com 2019 - 2024. All rights reserved.