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

时间:2017-09-30 15:51:06

标签: swift parse-platform

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

变量声明:

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变量做任何事情时,我得到""之类的该变量从未更新过。

1 个答案:

答案 0 :(得分:1)

这是因为传递给findObjectsInBackground方法的代码是在找到所有对象后仅运行 的代码。

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

我们不希望剩下的代码暂停并等待这个!这会减慢我们的计划。所以程序继续经过这个块直到它完成。这就是为什么选项2 为空的原因,因为findObjectsInBackground还没有时间获取对象,所以代码已直接跳到选项2 < / em>是。

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

这意味着您只能确保self.varCost在此块中具有正确的值(或闭包,因为它在Swift中调用)。