Получение данных из Firebase без дубликатов - PullRequest
0 голосов
/ 01 мая 2020

Я использую несколько циклов для извлечения данных из базы данных, но это приводит к извлечению дубликатов данных. Как лучше всего решить эту проблему?

func fetchPost(completion: @escaping ([Post])->()) {
    let postRef = self.databaseRef.child("Topics").queryOrdered(byChild: "userId").queryEqual(toValue: "myId")
        postRef.observe(.value, with: { (snapshot) in
            var resultsArray = [Post]()
            var topicIdArray = [Any]()
                for topic in snapshot.children.allObjects as! [DataSnapshot] {
                    let topicId = topic.childSnapshot(forPath: "topicId").value
                    topicIdArray.append(topicId)
                        for element in topicIdArray {
                            let postRef = self.databaseRef.child("posts").queryOrdered(byChild: "topic").queryEqual(toValue: element)
                                postRef.observe(.value, with: { (snapshot) in
                                    for child in snapshot.children {
                                        let post = Post(snapshot: child as! DataSnapshot)
                                        resultsArray.append(post)

                                    }
                                    completion(resultsArray)
                                })

                        }
                }
    }) { (error) in
        print(error.localizedDescription)
    }
}

1 Ответ

2 голосов
/ 01 мая 2020

Используйте Observe Single Event, чтобы избежать дублирования

func fetchPost(completion: @escaping ([Post])->()) {
    let postRef = self.databaseRef.child("Topics").queryOrdered(byChild: "userId").queryEqual(toValue: "myId")
        postRef.observeSingleEvent(.value, with: { (snapshot) in
            var resultsArray = [Post]()
            var topicIdArray = [Any]()
                for topic in snapshot.children.allObjects as! [DataSnapshot] {
                    let topicId = topic.childSnapshot(forPath: "topicId").value
                    topicIdArray.append(topicId)
                        for element in topicIdArray {
                            let postRef = self.databaseRef.child("posts").queryOrdered(byChild: "topic").queryEqual(toValue: element)
                                postRef.observe(.value, with: { (snapshot) in
                                    for child in snapshot.children {
                                        let post = Post(snapshot: child as! DataSnapshot)
                                        resultsArray.append(post)

                                    }
                                    completion(resultsArray)
                                })

                        }
                }
    }) { (error) in
        print(error.localizedDescription)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...