当前位置: 首页 > 知识库问答 >
问题:

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

况浩邈
2023-03-14

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

这可以成功地工作--并且一旦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个答案

竺翰海
2023-03-14

如果我没有读错,您将在循环中调用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()
}
 类似资料:
  • 复杂的画图函数利用2-D线性转换能让你画出任意图形。这个功能与Adobe? PostScript 语言实现的功能很相似,在X和Win32上,在画线段之前所有的转换顶点都是用整数表示,这就限制了画图的精确性。如果要画比较精确的图形,最好用OpenGL来画。 void fl_push_matrix() void fl_pop_matrix() 保存和恢复当前的转换,堆栈的最大深度为4 void fl

  • 为什么在添加捕获元素时,下面的lambda不符合签名? 但这会吗? 签名:

  • LCUI 实现了一些图形 API 用于解决组件的背景、边框和阴影的绘制问题。它们都依赖绘制上下文且都支持局部区域绘制,使得 LCUI 能够利用脏矩形机制和 OpenMP 并行渲染来提升渲染性能。 绘制背景 背景绘制参数被定义为LCUI_Background 结构体类型的对象,由 Background_Paint() 函数负责绘制。在下面的例子中,我们将画布中的区域 (200, 100, 400,

  • 问题内容: 在Swift 2中是否有任何 内置 方法来创建有序地图?数组按对象附加到其的顺序排序,但字典不排序。 例如 是否有任何内置方法来创建有序映射,该有序映射的排序方式与数组相同,还是我必须创建自己的类? 我想尽可能避免创建自己的类,因为Swift所包含的任何内容都将更有效率。 问题答案: 您可以通过输入具有类型的键来对其进行排序。 要么 我推荐第一种,因为它是一种更常见的格式(例如JSON

  • 各位程序员好, 我在代码中遇到了一个似乎无法破解的小问题。它与Java的Jframe;图形区域有关。我将在下面发布的代码是在一个绘图方法上。其目的是绘制ArrayList中的房间,该房间位于另一个类中,因此之前。这种偏离航线的情况不会发生,因此在这里发帖。 获取有关该项目的背景信息是ArrayList,其中包含各种不同大小和颜色的房间。房间本身就是物体。 首先是课程: 下面是用于创建房间的类。 我

  • 问题内容: 我正在尝试将地图()的内容复制到另一个地图()内,然后清除, 以便它可以在下一次迭代/循环中获取新值。问题在于,如果不清除超级地图中的参考,就无法清除地图。这是一些伪代码。 我也尝试了一些动态的东西,但显然会引发错误(无法指定为nil) 问题是如何创建关联地图?在PHP中,我只使用aSuperMap [y] [x] = aData。似乎golang没有任何明显的方法。如果我从超级地图中