提问者:小点点

Swift中的函数复制导致图形不恰当地加倍


我目前正在尝试从我的数据库中提取一系列项,并将它们追加到存储在变量中的数组中。

这可以成功地工作--并且一旦viewDidLoad执行。

然后,我想调用一个函数来迭代这个数组,对于其中的每个元素,取出一个平衡值,并将其添加到全局变量中。

我可以通过在我的初始数据库调用中调用函数,并将其包装在DispatchQueue中来实现这一点--这是重复的,实际上是值的两倍,几乎就像add函数被调用两次一样。

但我不知道这是在哪里发生的,也不知道为什么。我的理解是,这个数据库调用只发生一次,但似乎函数被调用了两次。

特别是,我的问题是这样发生的:

  • 当数据库调用解析时,TotalBalance等于0
  • 数据库调用找到两个条目,将它们保存到帐户变量
  • CalculateBalance查找第一个余额2,第二个余额3,并相加,将totalBalance变量更新为5
  • 再次调用CalculateBalance,将2和3加到totalBalance并等于10

totalBalance应该等于5,但它得到2+3两次,所以最终是10。

这是我的代码:

class DashboardViewController: UIViewController {
    
    let db = Firestore.firestore()
    
    var accounts: [Account] = []
    
    var totalBalance: Int = 0
    
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var balanceLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
      
        fetchAccounts()
    }
    
    func fetchAccounts() {
        
        db.collection("accounts")
            .getDocuments { (QuerySnapshot, error) in
                if let err = error {
                    print("Error getting documents: \(err)")
                } else {
                    if let snapshotDocuments = QuerySnapshot?.documents {
                        for doc in snapshotDocuments {
                            let data = doc.data()
                            if let balance = data["accountBalance"] as? String {
                                let newAccount = Account(
                                    accountBalance: balance,
                                    )
                                self.accounts.append(newAccount)
                            }
                            DispatchQueue.main.async {
                                self.calculateBalance()
                                self.tableView.reloadData()
                            }
                            
                        }
                    }
                }
            }
    }
    
    func calculateBalance() {
        for cash in accounts {
            totalBalance += Int(cash.accountBalance)!
            
        }
        
        DispatchQueue.main.async {
            self.balanceLabel.text = "Overall balance - -£\(self.totalBalance)"
        }
    }

}

这里的任何反馈都将非常感谢--我一直在挠头,但认为有人从外面进来将能够发现我的问题所在。


共1个答案

匿名用户

如果我没有读错,您将在循环中调用CalculateBalance方法,如果SnapshotDocuments中有5个帐户,则该方法将被调用5次:

for doc in snapshotDocuments {
    let data = doc.data()
    if let balance = data["accountBalance"] as? String {
        let newAccount = Account(
            accountBalance: balance,
        )
        self.accounts.append(newAccount)
    }

    //This will get called multiple times
    //DispatchQueue.main.async {
    //    self.calculateBalance()
    //   self.tableView.reloadData()
    //}                           
}

//This will get called only once
DispatchQueue.main.async {
    self.calculateBalance()
   self.tableView.reloadData()
}