Rayisooo
Rayisooo

Reputation: 122

TableView creates duplicates cells

when the like button is tapped it should increase the number of likes on the cell thats related to it but im having an issue which it creates a totally new cell with the updated number of likes I believe the problem is coming from how im loading my cells I believe I also need to add the function remove() so it clears the old data after the snapshot listener takes effect but im not too sure

func loaddailymotivation() {
FirebaseReferece(.MotivationDAILY).addSnapshotListener { querySnapshot, error in

    guard let snapshot = querySnapshot else {
        print("Error fetching snapshots: \(error!)")
        return
    }

    snapshot.documentChanges.forEach { diff in
        if (diff.type == .added) { // this line means if the chage that happened in the document was equal to added something

            let data = diff.document.data()
              print("we have\(snapshot.documents.count) documents in this array")

              let dailyMotivationID = data["objectID"] as! String

              let dailymotivationTitle = data["Motivation title"] as! String //calls the data thats heald inside of motivation title in firebase
              let dailyMotivationScripture = data["daily motivation scripture"] as! String //calls the data thats heald inside of Motivation script in firebase

              let dailyMotivationNumberOfLikes = data["Number of likes in daily motivation post"]as! Int



             let MdataModel = motivationDailyModel(RealMotivationID: dailyMotivationID, RealmotivationTitle: dailymotivationTitle, RealmotivationScrip: dailyMotivationScripture, RealmotivationNumberOfLikes: dailyMotivationNumberOfLikes)

            self.motivationThoughts.append(MdataModel)

        }
        //===== //=====
        if (diff.type == .modified) {
            print("Modified data: \(diff.document.data())")

             let newdata = diff.document.data()

             let dailyMotivationID = newdata["objectID"] as! String

             let dailymotivationTitle = newdata["Motivation title"] as! String //calls the data thats heald inside of motivation title in firebase
             let dailyMotivationScripture = newdata["daily motivation scripture"] as! String //calls the data thats heald inside of Motivation script in firebase

            let dailyMotivationNumberOfLikes = newdata["Number of likes in daily motivation post"]as! Int


            let MdataModel = motivationDailyModel(RealMotivationID: dailyMotivationID, RealmotivationTitle: dailymotivationTitle, RealmotivationScrip: dailyMotivationScripture, RealmotivationNumberOfLikes: dailyMotivationNumberOfLikes)


            self.motivationThoughts.append(MdataModel)

            //  here you will receive if any change happens in your data add it to your array as you want
        }

        DispatchQueue.main.async {

            self.tableview.reloadData()
        }

    }
}

}

Upvotes: 0

Views: 80

Answers (1)

vadian
vadian

Reputation: 285039

Both branches do exactly the same.

In the modified branch you have to get the corresponding object in motivationThoughts, update it and put it back, rather than creating a new object.

Something like

if diff.type == .modified {
    print("Modified data: \(diff.document.data())")
    let newdata = diff.document.data()

    let objectID = newdata["objectID"] as! String
    guard let dailymotivationIndex = motivationThoughts.firstIndex(where: {$0.dailyMotivationID == objectID}) else { return }

    var dailymotivation = self.motivationThoughts[dailymotivationIndex]
    let dailyMotivationNumberOfLikes = newdata["Number of likes in daily motivation post"] as! Int
    dailymotivation.RealmotivationNumberOfLikes = dailyMotivationNumberOfLikes
    self.motivationThoughts[dailymotivationIndex] = dailymotivation
}

And I recommend to reload only the row in the modified branch rather than the entire table view.

Upvotes: 1

Related Questions