TableView создает дубликаты ячеек - PullRequest
0 голосов
/ 19 апреля 2020

когда нажата кнопка «Мне нравится», это должно увеличить количество лайков в ячейке, которая связана с ней, но у меня возникла проблема, которая создает совершенно новую ячейку с обновленным количеством лайков. Я считаю, что проблема заключается в том, как я загрузка ячеек Мне кажется, мне также нужно добавить функцию remove (), чтобы она очищала старые данные после того, как прослушиватель снимков вступил в силу, но я не слишком уверен

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()
        }

    }
}

}

1 Ответ

1 голос
/ 19 апреля 2020

Обе ветви делают одно и то же.

В ветке modified вы должны получить соответствующий объект в motivationThoughts, обновить его и поместить обратно, вместо создания нового объекта.

Что-то вроде

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
}

И я рекомендую перезагрузить только строку в ветви modified, а не все табличное представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...