Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 我希望我的tableview在看到firestore数据库中的更改后重新加载_Swift_Xcode_Firebase_Google Cloud Firestore - Fatal编程技术网

Swift 我希望我的tableview在看到firestore数据库中的更改后重新加载

Swift 我希望我的tableview在看到firestore数据库中的更改后重新加载,swift,xcode,firebase,google-cloud-firestore,Swift,Xcode,Firebase,Google Cloud Firestore,**我希望我的tableview在看到firestore数据库发生更改后重新加载我以为使用tableview重新加载会使其重新加载,但不是这样它只在我重新启动应用程序后加载新数据我希望在函数load daily motivation发生更改后立即重新加载新数据** import UIKit import Firebase //MARK: MAINVIEW MOTIVATION class motivationviewcontroller : UIViewCont

**我希望我的tableview在看到firestore数据库发生更改后重新加载我以为使用tableview重新加载会使其重新加载,但不是这样它只在我重新启动应用程序后加载新数据我希望在函数load daily motivation发生更改后立即重新加载新数据**

    import UIKit
    import Firebase

   //MARK: MAINVIEW MOTIVATION

    class motivationviewcontroller : UIViewController,UITableViewDataSource,UITableViewDelegate{


var motivationThoughts = [MotivatioNDataModel]()

var tableview : UITableView!

override func viewDidLoad() {
    print("madicc")

    print("the user logged in is \( 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()
    self.tableview.reloadData()


}

override func viewDidAppear(_ animated: Bool) {


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

}



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

  //MARK: LOADS THE DATA INTO THE TABLEVIEW
   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: motivationThoughts[indexPath.row])

    return cell!
   }





//MARK: FUNCTION THAT HANDLES GETTING THE DATA FROM FIREBASE
func loaddailymotivation() {

    FirebaseReferece(.MotivationDAILY).getDocuments { (snapshot, error) in

        if let error = error {
            print("error getting MOTIVATIONDAILY DATA \(error.localizedDescription)")
        }

        else {

            guard let snapshot = snapshot else { return }

        for allDocument in snapshot.documents {

                let data = allDocument.data()


                print("\(allDocument.documentID) => \(allDocument.data())")

                print("we have\(snapshot.documents.count) documents in this array")

                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 newthought = MotivatioNDataModel(RealmotivationTitle: dailymotivationTitle, RealmotivationScrip: dailyMotivationScripture, RealmotivationNumberOfLikes: dailyMotivationNumberOfLikes )
            self.motivationThoughts.append(newthought)


              }
        }


    }


}
您可以尝试将“addSnapshotListener”添加到“处理从FIREBASE获取数据的函数”中

让我们尝试这样添加它:

func loaddailymotivation() {

FirebaseReferece(.MotivationDAILY).getDocuments.addSnapshotListener { (snapshot, error) in

    if let error = error {
        print("error getting MOTIVATIONDAILY DATA \(error.localizedDescription)")
    }

    else {

        guard let snapshot = snapshot else { return }

    for allDocument in snapshot.documents {

            let data = allDocument.data()


            print("\(allDocument.documentID) => \(allDocument.data())")

            print("we have\(snapshot.documents.count) documents in this array")

            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 newthought = MotivatioNDataModel(RealmotivationTitle: dailymotivationTitle, RealmotivationScrip: dailyMotivationScripture, RealmotivationNumberOfLikes: dailyMotivationNumberOfLikes )
        self.motivationThoughts.append(newthought)


          }
    }


}

问题是您正在获取数据,但没有重新加载tableView。在这之后,请使用下面的方法更改loaddailymotivation()

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) {

                    let data = diff.document.data()

                    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 newthought = MotivatioNDataModel(RealmotivationTitle: dailymotivationTitle, RealmotivationScrip: dailyMotivationScripture, RealmotivationNumberOfLikes: dailyMotivationNumberOfLikes )
                    self.motivationThoughts.append(newthought)

                }
                if (diff.type == .modified) {
                    print("Modified data: \(diff.document.data())")
                    //  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()
                }

            }
        }
    }
在这里,我为您的firestore数据添加了监听器,因此,如果有任何新数据添加到数据库中,或者数据库中有任何数据更改,您将在应用程序中收到该数据,并实时反映这些更改


按照我在代码中的注释做一件事。

因此,当我单击“相似”按钮时,我有一个“相似”按钮,我希望更改显示在tableview单元格中,我将其放在哪里?在上面的“修改”if body中的代码中,如果您将收到更改的数据集,请在那里编写代码