如果在 React Native 上使用我的 Android 应用程序时互联网连接丢失,我会尝试强制 Firebase 使用缓存中的数据。
这个想法是,当用户打开屏幕时,他会看到一个组列表。这些组存储在 Firestore 中。
如果有互联网连接,那就没有问题。但是,如果我关闭
emulator
上的互联网,那么使用缓存就会变得非常奇怪。
我在做什么和我看到什么::
一直以来我都没有在模拟器上打开互联网。因此组列表已从缓存中返回。但为什么要花这么长时间呢? 请注意,我在
.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
我准备了一些动画以使其更清晰......
有互联网连接>>>
没有互联网连接>>>
我想我已经认识到自己的错误了。
问题在于,即使没有连接,某些方法也会首先使用
.get({source: 'server'});
进行调用。
之后,调用带有
.get({source: 'cache'})
的方法;