代码之家  ›  专栏  ›  技术社区  ›  Christophy Barth

从Firestore中的不同文档中获取项目并监听更新

  •  0
  • Christophy Barth  · 技术社区  · 5 年前

    我试图通过迭代从不同的文档中获取数据,但我想监听更新,以了解何时添加了新数据。让我们以下面的代码为例。有一个当前用户关注的用户列表,在这种情况下,我试图从他们每个人那里获取帖子列表。下面的代码实际上迭代并获取数据。但是,当以下列表中的一个用户添加新帖子时,数据会被复制。我逐渐意识到,之所以会发生这种情况,是因为应该清除持有这些职位的名单。问题是,应该在哪条线上清除。将其放入for循环中只能导致在为以下列表中的另一个用户获取之前清除每个帖子数据。那怎么办?

    FirebaseFirestore.getInstance()
                .collection("Users")
                .document(FirebaseAuth.getInstance().currentUser!!.uid)
                .collection("Following").addSnapshotListener { snapshot, error ->
                    
                    followingList.clear()
                    postList.clear()
    
                    if (error != null) {
                        Log.d("LOG", error.message!!)
                    } else {
                        for (i in snapshot!!.documents) {
                            followingList.add(i.id)
                        }
    
                        for (following in followingList) {
                            FirebaseFirestore.getInstance().collection("Users")
                                .document(following).collection("Posts")
                                .addSnapshotListener { value, error2 ->
    
                                    if (error2 != null) {
                                        Log.d("LOG", error2.message!!)
                                    } else {
    
                                        val posts = value!!.toObjects(Post::class.java)
                                        for (post in posts) {
                                            postList.add(post)
                                        }
    
                                        postAdapter.notifyDataSetChanged()
                                    }
                                }
                        }
    
                    }
    
    
                }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   favs    5 年前

    我认为你需要在之前添加它 val posts = value!!.toObjects(Post::class.java) 这是因为外部侦听器只侦听以下更新。内部是在听帖子,所以如果有新帖子,内部是唯一被通知的帖子,你永远不会真正清除帖子列表。所以有点像,

    var postList = hashMapOf<String, MutableList<Post>>() // <--- outside first snapshotListener
    ...
    
    for (following in followingList) {
       FirebaseFirestore.getInstance().collection("Users")
          .document(following).collection("Posts")
          .addSnapshotListener { value, error2 ->
    
             postList[following]?.clear() // <--- clearing list of posts for this specific user id
    
             if (error2 != null) {
                Log.d("LOG", error2.message!!)
             } else {
                val posts = value!!.toObjects(Post::class.java)
                postList[following] = posts // <---
                ...
    

    这只是我的第一个想法。希望它能奏效。