我目前正在尝试从我的数据库中提取一系列项,并将它们追加到存储在变量中的数组中。
这可以成功地工作--并且一旦viewDidLoad执行。
然后,我想调用一个函数来迭代这个数组,对于其中的每个元素,取出一个平衡值,并将其添加到全局变量中。
我可以通过在我的初始数据库调用中调用函数,并将其包装在DispatchQueue中来实现这一点--这是重复的,实际上是值的两倍,几乎就像add函数被调用两次一样。
但我不知道这是在哪里发生的,也不知道为什么。我的理解是,这个数据库调用只发生一次,但似乎函数被调用了两次。
特别是,我的问题是这样发生的:
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)"
}
}
}
这里的任何反馈都将非常感谢--我一直在挠头,但认为有人从外面进来将能够发现我的问题所在。
如果我没有读错,您将在循环中调用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()
}