即使在 class 之后声明了变量,也无法访问查询函数之外的变量

Unable to access variable outside of query function even though variable is declared after class

我有一些查询 运行 将带有来自 Parse 服务器的数据的变量加载到在 class 正下方声明的变量中。当我在查询函数中将变量打印到控制台时,它打印正确,但是当我在函数外部调用它或打印它时,它是空的。知道我哪里出错了吗?

变量声明:

class AddTaskViewController: UIViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate {
var varCost = ""

查询加载变量:

let varCostQuery = PFQuery(className: "Class1")
varCostQuery.findObjectsInBackground(block: { (objects, error) in
    if error != nil {
        print(error!)
    } else {
        varCostQuery.whereKey("Header", equalTo: self.HeaderSelection.text)
        varCostQuery.findObjectsInBackground(block: { (objects, error) in
            for object in objects! {
                self.varCost = object["pricePerUnit"] as! String
                print(self.varCost) //Option1
            }
        })
    }
})
print(varCost) //Option2

当我打印 Option1 时,我得到的数据与我正在寻找的完全一样,但是当我打印 Option2 或尝试在这个级别对 varCost 变量做任何事情时,我得到 "" 好像变量从未更新过。

发生这种情况是因为传递给 findObjectsInBackground 方法的代码是 运行 找到所有对象后的代码。

因为这段代码只有在找到对象时才会调用,这可能会花费一些时间,所以将这段代码发送到后台队列等待找到对象。

我们不希望我们的其余代码暂停并等待这个!那会大大减慢我们的程序。所以程序继续通过这个块,直到它完成。这就是为什么 Option 2 是空的,因为 findObjectsInBackground 还没有来得及获取对象,所以代码直接跳到了 Option 2是。

最终找到对象后,将调用代码块并打印选项 1

这意味着您只能确定 self.varCost 将在此块(或 closure 中获得正确的值,因为它在 Swift).