我有一些查询正在运行,以便将来自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
变量做任何事情时,我得到""
之类的该变量从未更新过。
答案 0 :(得分:1)
这是因为传递给findObjectsInBackground
方法的代码是在找到所有对象后仅运行 的代码。
因为只有在找到对象时才会调用此代码,这可能需要一些时间,因此将此代码发送到后台队列以等待找到对象。
我们不希望剩下的代码暂停并等待这个!这会减慢我们的计划。所以程序继续经过这个块直到它完成。这就是为什么选项2 为空的原因,因为findObjectsInBackground
还没有时间获取对象,所以代码已直接跳到选项2 < / em>是。
当最终找到对象时,将调用代码块并打印选项1 。
这意味着您只能确保self.varCost
在此块中具有正确的值(或闭包,因为它在Swift中调用)。