iOS Swift 5 在 TabBarController 的视图控制器中使用来自云数据库的数据

iOS Swift 5 Using Data from Cloud Database in View Controllers in TabBarController

问题:我无法将数据下载到单例中的数组中 class 以填充两个视图控制器中的 table 视图。

我正在编写一个带有 Parse 后端的存折 iOS 应用程序。我在 Tab Bar Controller 中有一个登录 viewController 和其他四个视图控制器。我有一个单例 class 从 Parse 服务器获取数据并加载四个数组。我希望该数据填充其他两个视图控制器中的 table 视图。我想尽可能少地拨打数据电话。初始视图控制器是用户输入借方和贷方的地方。所以我的计划是从 viewDidLoad 调用 GetData class 来填充 tables 以防用户在没有输入借方或贷方的情况下访问它们。

当输入借方或贷方时,有一个函数在将借方或贷方保存到 Parse 服务器后,再次调用 GetData class 以更新 GetData [=36= 中的数组].

两个视图控制器访问GetDataclass中的数组来填充tables,并且在每个视图控制器的viewDidAppear中有一个tableView.reloadData()调用时通过选项卡控制器访问视图。

它最多只能间歇性地工作。有时候更新成功5次就一直显示旧数据,然后突然显示所有数据

查看我的云数据库,创建时所有条目都在那里,并且我已验证 viewWillAppear 在每个访问的视图控制器中触发。

我需要的是一种可靠的方法来让数据在其他视图控制器中更新。时间。如果需要,我很乐意废弃此应用程序并重写。

这是我的单例代码class:

    class GetData {

        static let sharedInstance = GetData()

        var transactionArray = [String]()
        var dateArray = [String]()
        var toFromArray = [String]()
        var isDebitArray = [String]()

        func getdata() {

            let query = PFQuery(className:"Transaction")

            query.findObjectsInBackground { (objects, error) in

                self.transactionArray.removeAll()
                self.dateArray.removeAll()
                self.toFromArray.removeAll()
                self.isDebitArray.removeAll()

                print("query fired")

                    if objects != nil {

                    for object in objects! {

                        if let amount = object.object(forKey: "amount") as? String {
                            if let date = object.object(forKey: "date") as? String {
                                if let toFrom = object.object(forKey: "toFrom") as? String {
                                    if let isDebit = object.object(forKey: "isDebit") as? String {

                                        self.transactionArray.append(amount)
                                        self.dateArray.append(date)
                                        self.toFromArray.append(toFrom)
                                        self.isDebitArray.append(isDebit)

                                        }
                                    }
                                }
                            }
                        }
                    }

                 self.transactionArray.reverse()
                 self.dateArray.reverse()
                 self.toFromArray.reverse()
                 self.isDebitArray.reverse()

                 dump(self.toFromArray)

                }
        }
    }

这是其中一个视图控制器的示例:

class RecordVC: UIViewController, UITableViewDelegate, UITableViewDataSource {

        @IBOutlet var recordTableView: UITableView!

         override func viewDidLoad() {
                super.viewDidLoad()

                recordTableView.delegate = self
                recordTableView.dataSource = self

             recordTableView.reloadData()

           }

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)

            recordTableView.reloadData()

            print("recordVC viewWillAppear fired")

        }


           @IBAction func resetFoundButton(_ sender: Any) {
           }

           func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

               let cell = recordTableView.dequeueReusableCell(withIdentifier: "RecordCell", for: indexPath) as! RecordCell
               cell.amountLabel?.text = "$\(GetData.sharedInstance.transactionArray[indexPath.row])"
               cell.dateLabel?.text = "\(GetData.sharedInstance.dateArray[indexPath.row])"
               cell.toFromLabel?.text = "\(GetData.sharedInstance.toFromArray[indexPath.row])"
               let cellColor = backGroundColor(isDebit: GetData.sharedInstance.isDebitArray[indexPath.row])
               cell.backgroundColor = cellColor
               cell.backgroundColor = cellColor
               return cell

               }

           func backGroundColor(isDebit:String) -> UIColor{

               if isDebit == "false" {

                   return UIColor.green

                   } else {

                   return UIColor.blue

                   }

               }

           func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

               return GetData.sharedInstance.transactionArray.count

           }


    }

谢谢

我想说的是,在执行查询并在 GetData Class 中更新数据之后,不是通过在 viewWillAppear() 中调用 tableView.reloadData() 来重新加载表,而是应该发出通知或在 tableview 中使用委托 reloadData()。

发生的情况是,有时当调用 tableView.reloadData() 时,单例中的数据 class (GetData class) 尚未更新。

func getdata() {

        let query = PFQuery(className:"Transaction")

        query.findObjectsInBackground { (objects, error) in

            self.transactionArray.removeAll()
            self.dateArray.removeAll()
            self.toFromArray.removeAll()
            self.isDebitArray.removeAll()

            print("query fired")

                if objects != nil {

                for object in objects! {

                    if let amount = object.object(forKey: "amount") as? String {
                        if let date = object.object(forKey: "date") as? String {
                            if let toFrom = object.object(forKey: "toFrom") as? String {
                                if let isDebit = object.object(forKey: "isDebit") as? String {

                                    self.transactionArray.append(amount)
                                    self.dateArray.append(date)
                                    self.toFromArray.append(toFrom)
                                    self.isDebitArray.append(isDebit)
                           // Here you should fire up a notification to let the 2 ViewControllers know that data has to be reloaded.
                                    }
                                }
                            }
                        }
                    }
                }

             self.transactionArray.reverse()
             self.dateArray.reverse()
             self.toFromArray.reverse()
             self.isDebitArray.reverse()

             dump(self.toFromArray)

            }
    }