我正在使用Firebase实时数据库。我有一个对象,其中包含我们所有用户创建的所有帖子。这个物体很大。
为了快速显示帖子,我们为每个用户提供了一个具有相关帖子ID的对象。
结构如下:
/allPosts/$postID/
: { $postID: {id: $postID, details: '', title: '', timestamp: ''} }
/user/$userID/postsRelevantToThisUser/
: { $postID: {id: $postID} }
'postsRelevantToThisUser'仅包含帖子的ID。我需要遍历每个ID并从/ allPosts /
中检索整个帖子信息结果,客户端将不必下载整个allPosts对象,并且该应用程序将更快。
为此,我编写了以下代码。它正在成功检索和呈现仅相关帖子。每当在Firebase实时数据库中的/ postsRelevantToThisUser /中添加或删除新的postID时,React Native都会正确地重新呈现该列表。
但是,当/ allPosts / $ postID中的任何内容发生更改时,例如:如果title参数发生更改,则不会反映在视图中。
什么是解决此问题的好方法?
let userPostRef = firebase.database().ref(`/users/${uid}/postsRelevantToThisUser`)
userPostRef.on('value', (snapshot) => {
let relPostIds = [];
let posts = [];
snapshot.forEach(function(childSnapshot) {
const {id} = childSnapshot.val();
relPostIds.push(id);
})
relPostIds.map(postId => {
firebase.database().ref(`allPosts/${postId}`).on('value', (postSnapshot) => {
let post = postSnapshot.val()
posts.push(post);
this.setState({ postsToRender:posts });
})
})
答案 0 :(得分:0)
由于您已将显示帖子的数据分散到多个位置,因此,如果要获取有关该数据的实时更新,则需要将侦听器连接到多个位置。
因此,要监听标题更新,您需要保持一个监听器,以监听用户当前可以看到的每个/allPosts/$postID
。虽然跟踪所有这些侦听器的代码可能有点挑剔,但实际上它们对于Firebase本身还是非常有效的,因此性能至少应达到几十个侦听器(并且用户不太可能会主动阅读)一次获得更多帖子标题。
或者,您可以在每个用户的/user/$userID/postsRelevantToThisUser
节点下复制要在列表视图中显示的信息。这样,您可以复制更多数据,但不需要其他侦听器。
这两种方法都可以,但是我个人比较喜欢后者,因为它可使读取数据的代码(对于可伸缩性最关键)更简单。