0

Im fetching post data from Firestore and displaying in tableview.Im trying to implement Follow feature and after fetching data of following post data gets duplicated.

getPostData(name:String,uid:String,img:String,followingId:String) this function is used to get post data from firebase

var postArray = [postData]()

    func getPostData(name:String,uid:String,img:String,followingId:String) {
        FirebaseReference(.Post).getDocuments{(snapshot, error) in
            if error != nil {
                print("Document Error: ", error!)
            } else {
                if let doc = snapshot, doc.isEmpty == false {
                    print("Post Document is present.")
                    let desc = doc.documents
                    let dateFormatter = DateFormatter()
                    dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss a"
                    self.postArray.removeAll()
                    for item in desc
                    {
                        let post = item.data()
                        let puid = item.documentID
                        
                        let title = post["title"] as! String
                        let audioDuration = post["audioDuration"] as! String
                        let audioUrl = post["audioUrl"] as! String
                        let date = post["date"] as! String
                        let postId = post["postId"] as! String
                        let userId = post["userId"] as! String
                        let emoji = post["emoji"] ?? ""
                        let feeling = post["feeling"] ?? ""
                        
                        FirebaseReference(.Post).document(puid).collection("Like").getDocuments{(snapshot1,error) in
                            if error != nil {
                                print("Document Error: ", error!)
                            } else {
                                
                                if let doc1 = snapshot1, doc1.isEmpty == false
                                {
                                    let likecount = snapshot1?.count ?? 0
                                    let desc1 = doc1.documents
                                    var likeByUserId : String?
                                    var likeId : String?
                                    
                                    for item in desc1 {
                                        likeByUserId = item["likedCommentToUserId"] as? String
                                        likeId = item["likeCommentByUserId"] as? String
                                    }
                                    
                                    FirebaseReference(.Post).document(puid).collection("Comment").getDocuments{(snapshot2,error) in
                                        if error != nil {
                                            print("Document Error: ", error!)
                                        } else {
                                            
                                            if let doc2 = snapshot2, doc2.isEmpty == false
                                            {
                                                let commentCount = snapshot2?.count ?? 0
                                              
                                                FirebaseReference(.Post).document(puid).collection("Report").getDocuments{(snapshot3,error) in
                                                    
                                                    if error != nil {
                                                        print("Document Error: ", error!)
                                                    } else {
                                                        
                                                        if let doc3 = snapshot3, doc3.isEmpty == false
                                                        {
                                                            let reportCount = snapshot3?.count ?? 0
                                                            let desc2 = doc3.documents
                                                            
                                                            var reportByUserId : String?
                                                            
                                                            for item in desc2 {
                                                                reportByUserId = item["userId"] as? String
                                                            }
                                                            
                                                            if userId == uid
                                                            {
                                                                
                                                                let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: likecount, commentCount: commentCount, reportCount: reportCount, img: img, likedByUserId:likeByUserId, likedId: likeId, reportByUserId: reportByUserId,followingId: followingId)
                                                                self.postArray.append(object)
                                                                self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
                                                                self.voicebookTableView.reloadData()
                                                                
                                                            }
                                                        }
                                                        else
                                                        {
                                                            
                                                            if userId == uid
                                                            {
                                                                
                                                                let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: likecount, commentCount: commentCount,reportCount: 0, img: img, likedByUserId:likeByUserId, likedId: likeId, reportByUserId: "NA",followingId: followingId)
                                                                self.postArray.append(object)
                                                                self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
                                                                self.voicebookTableView.reloadData()
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                FirebaseReference(.Post).document(puid).collection("Report").getDocuments{(snapshot3,error) in
                                                    
                                                    if error != nil {
                                                        print("Document Error: ", error!)
                                                    } else {
                                                        
                                                        if let doc3 = snapshot3, doc3.isEmpty == false
                                                        {
                                                            let reportCount = snapshot3?.count ?? 0
                                                            let desc2 = doc3.documents
                                                            
                                                            var reportByUserId : String?
                                                            
                                                            for item in desc2 {
                                                                reportByUserId = item["userId"] as? String
                                                            }
                                                            
                                                            if userId == uid
                                                            {
                                                                
                                                                let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: likecount, commentCount: 0,reportCount: reportCount, img: img, likedByUserId: likeByUserId, likedId: likeId, reportByUserId: reportByUserId,followingId: followingId)
                                                                self.postArray.append(object)
                                                                self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
                                                                self.voicebookTableView.reloadData()
                                                            }
                                                        }
                                                        else
                                                        {
                                                            if userId == uid
                                                            {
                                                                
                                                                let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: likecount, commentCount: 0,reportCount: 0, img: img, likedByUserId: likeByUserId, likedId: likeId, reportByUserId: "NA",followingId: followingId)
                                                                self.postArray.append(object)
                                                                self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
                                                                self.voicebookTableView.reloadData()
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                   
                                    FirebaseReference(.Post).document(puid).collection("Comment").getDocuments{(snapshot,error) in
                                        if error != nil {
                                            print("Document Error: ", error!)
                                        } else {
                                            
                                            if let doc2 = snapshot, doc2.isEmpty == false
                                            {
                                                let commentCount = snapshot?.count ?? 0
                                                
                                                FirebaseReference(.Post).document(puid).collection("Report").getDocuments{(snapshot3,error) in
                                                    
                                                    if error != nil {
                                                        print("Document Error: ", error!)
                                                    } else {
                                                        
                                                        if let doc3 = snapshot3, doc3.isEmpty == false
                                                        {
                                                            let reportCount = snapshot3?.count ?? 0
                                                            let desc2 = doc3.documents
                                                            
                                                            var reportByUserId : String?
                                                            
                                                            for item in desc2 {
                                                                reportByUserId = item["userId"] as? String
                                                            }
                                                            
                                                            if userId == uid
                                                            {
                                                                let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: 0, commentCount: commentCount,reportCount: reportCount, img: img, likedByUserId: "NA", likedId: "NA", reportByUserId: reportByUserId,followingId: followingId)
                                                                self.postArray.append(object)
                                                                self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
                                                                self.voicebookTableView.reloadData()
                                                            }
                                                        }
                                                        else
                                                        {
                                                           
                                                            if userId == uid
                                                            {
                                                                let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: 0, commentCount: commentCount,reportCount: 0, img: img, likedByUserId: "NA", likedId: "NA", reportByUserId: "NA",followingId: followingId)
                                                                self.postArray.append(object)
                                                                self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
                                                                self.voicebookTableView.reloadData()
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                FirebaseReference(.Post).document(puid).collection("Report").getDocuments{(snapshot3,error) in
                                                    
                                                    if error != nil {
                                                        print("Document Error: ", error!)
                                                    } else {
                                                        
                                                        if let doc3 = snapshot3, doc3.isEmpty == false
                                                        {
                                                            let reportCount = snapshot3?.count ?? 0
                                                            let desc2 = doc3.documents
                                                           
                                                            var reportByUserId : String?
                                                           
                                                            for item in desc2 {
                                                                reportByUserId = item["userId"] as? String
                                                            }
                                                            
                                                            if userId == uid
                                                            {
                                                                let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: 0, commentCount: 0,reportCount: reportCount, img: img, likedByUserId: "NA", likedId: "NA", reportByUserId: reportByUserId,followingId: followingId)
                                                                self.postArray.append(object)
                                                                self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
                                                                self.voicebookTableView.reloadData()
                                                            }
                                                        }
                                                        else
                                                        {
                                                            
                                                            if userId == uid
                                                            {
                                                                let object = postData(audioDuration: audioDuration, audioUrl: audioUrl, date: date, postId: postId, title: title, userId: userId, name: name, emoji: emoji as? String, feeling: feeling as? String, likecount: 0, commentCount: 0,reportCount: 0, img: img, likedByUserId: "NA", likedId: "NA", reportByUserId: "NA",followingId: followingId)
                                                                self.postArray.append(object)
                                                            
                                                                self.postArray.sort(by: { dateFormatter.date(from:$0.date ?? "")?.compare(dateFormatter.date(from:$1.date ?? "")!) == .orderedDescending })
                                                                self.voicebookTableView.reloadData()
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

There is parameter name,uid,img and followingId getting from Firestore Users Collection Using this method getUsersDataFromFirebase()

func getUsersDataFromFirebase()
    {
        FirebaseReference(.Users).getDocuments{(snapshot, error) in
            if error != nil {
                print("Document Error: ", error!)
            } else {
                if let doc = snapshot, doc.isEmpty == false {
                    print("User Document is present.")
                    let desc = doc.documents
                    self.postArray.removeAll()
                    for item in desc
                    {
                        let user = item.data()
                        let name = user["name"] as! String
                        let uid = user["userID"] as! String
                        let img = user["imgUrl"] as? String
                        let date = user["date"] as! String
                        let gender = user["gender"] as? String
                        let location = user["location"] as! String
                        
                        FirebaseReference(.Users).document(FUser.currentUser()?.userID ?? "").collection("Following").getDocuments{(snapshot1,error) in
                            if error != nil {
                                print("Document Error: ", error!)
                            } else {
                                if let doc1 = snapshot1, doc1.isEmpty == false {
                                    let data = doc1.documents
                                    
                                    var followingid = ""
                                    self.postArray.removeAll()
                                    for newitem in data
                                    {
                                        let value = newitem.data()
                                        followingid = value["followedToUserId"] as? String ?? ""
                                        self.getPostData(name: name, uid: uid, img: img ?? "",followingId: followingid )
                                    }
                                }
                                else
                                {
                                    self.getPostData(name: name, uid: uid, img: img ?? "",followingId:"NA")
                                }
                            }
                        }
                        
                        if uid == FUser.currentUser()?.userID
                        {
                            let user1 = FUser(date: date, gender: gender ?? "",imgUrl: img ?? "",location: location, name: name, status: true, userID:"\(Auth.auth().currentUser?.uid ?? "")")
                            user1.saveUserLocally()
                            
                            let pimg = URL(string: img ?? "")
                            self.profileImage.sd_setImage(with: pimg, placeholderImage: UIImage(named: "demouser.png"))
                        }
                    }
                }
                else
                {
                    print("User Document is not present.")
                }
            }
        }
    }

Im getting output like in image

I have tried many times but my data still getting duplicates and I don't know where I'm doing wrong please can someone help me out with this issue.

Thank You

  • Reference: https://stackoverflow.com/questions/39307188/removing-duplicates-from-array-of-custom-objects-swift – Dinesh Dec 20 '21 at 08:30
  • I had already tried this but its not working – Aryan Vishwakarma Dec 20 '21 at 08:32
  • @AryanVishwakarma have you tried with Set. if you tried and still facing issue then your every object in array is different. i.e. any property of object is different than others – Protocol Dec 20 '21 at 09:37
  • Im using struct and Set is not working and exactly where should I write Set as I'm appending data on different different conditions @Rahul Phate – Aryan Vishwakarma Dec 20 '21 at 09:40

1 Answers1

1

The solution is continuous initialization.

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       
        let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier, for: indexPath)
        var cellText : String = ""
        if appDelegate.codeList.count == 0 {
            
            return cell
            
        }
      
        if indexPath.section == 0 {
            if indexPath.row < appDelegate.codeList.count {
                cellText = appDelegate.codeList[indexPath.row]
                cell.textLabel?.textAlignment = .center
                cell.textLabel?.textColor = .black
            }
            
        }
        
        cell.textLabel?.text = cellText
        
        return cell
    }
bdeviOS
  • 449
  • 1
  • 6