当快照侦听器生效时,“ Tableview Like”按钮将重复

时间:2020-04-19 05:35:38

标签: swift firebase uitableview

因此,基本上,当点按了“喜欢”按钮时,它假设会更改表视图中的“喜欢”次数,但实际上是在表视图数组的底部创建了一个重复的单元格,并使用了新的“喜欢”数目,ik im正在执行操作错误的,但是我不确定如果有更好的方法可以做到这一点,请欣赏显示给我的

import UIKit
import Firebase
 class motivationviewcontroller : UIViewController,UITableViewDataSource ,UITableViewDelegate{


var motivationThoughts = [motivationDailyModel]()
var Mous = motivationDailyModel()
var tableview : UITableView!

override func viewDidLoad() {

    print("the user logged in is \( String(describing: Auth.auth().currentUser?.email))")

    tableview =  UITableView(frame: view.bounds, style: .plain)
           tableview.backgroundColor = UIColor.white
           view.addSubview(tableview)


    var layoutGuide : UILayoutGuide!
    layoutGuide = view.safeAreaLayoutGuide

    let cellNib = UINib(nibName: "dailyMotivationTableViewCell", bundle: nil)
    tableview.register(cellNib, forCellReuseIdentifier: "DailyThoughtCELL")
    tableview.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
    tableview.topAnchor.constraint(equalTo: layoutGuide.topAnchor).isActive = true
    tableview.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true
    tableview.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true


    tableview.dataSource = self
    tableview.delegate = self


   loaddailymotivation()
                //listener()
    self.tableview.reloadData()


}

override func viewDidAppear(_ animated: Bool) {
  //loaddailymotivation()
    self.tableview.reloadData()


}



//======================================================================


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    motivationThoughts.count
   }

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "DailyThoughtCELL", for: indexPath) as? dailyMotivationTableViewCell

        cell!.generateCellsforDailymotivation(_MotivationdataMODEL: self.motivationThoughts[indexPath.row])
        return cell!
   }



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 个答案:

答案 0 :(得分:0)

我不知道在loaddailymotivation()之后是否再次调用viewDidLoad,但是在这种方法中,您正在执行self.motivationThoughts.append(MdataModel),它应该与您所说的一样。

我认为您需要一种方法来标识需要在数组中进行修改的项目,并对其进行替换/修改。 如果添加一个新对象,则表中还有一个元素