Swift - parse.com 的变量范围问题
Posted
技术标签:
【中文标题】Swift - parse.com 的变量范围问题【英文标题】:Swift - Issue with variable scope with parse.com 【发布时间】:2015-03-17 02:48:00 【问题描述】:自从 Swift 调用 parse.com 类 2 天以来,我一直在努力解决一个问题。
我在 UIViewController 类的根目录中声明了一个变量
var myVariable: 字符串?
我创建了一个函数来调用数据库并返回一个值
函数检索数据()
// Create the query
var queryTest:PFQuery = PFQuery(className: "myClasseName")
// Where clause
queryTest.whereKey("columnName", equalTo: "someText")
queryTest.getFirstObjectInBackgroundWithBlock (myParseObject:PFObject!, errreur: NSError!) -> Void in
self.myVariable = myParseObject["nameOfColumnOfContainerTheValueToBeReturned"] as? String
println("valeurTest dans la BD = \(self.myVariable)")
到目前为止,函数内的 println 返回了我的值!很棒
当我在 viewDidLoad 中调用我的函数时,问题就开始了。我想通过调用retrieveData() 函数来更改myVariable 的值。但是变量值没有变化!
override func viewDidLoad()
super.viewDidLoad()
self.retrieveData()
// The myVariable value should change
println("My new value =\(self.myVariable)")
感谢您的帮助!
【问题讨论】:
【参考方案1】:getFirstObjectInBackgroundWithBlock
是异步的(即它在后台线程上执行),因此您必须等待它完成才能访问该值。通过在调用getFirstObjectInBackgroundWithBlock
的方法后立即尝试打印,您正在尝试打印一个尚未检索到的变量,因为getFirstObjectInBackgroundWithBlock
还没有足够的时间来获取数据。
在您的第一个代码块中,self.myVariable
能够成功打印,因为它是在块内执行的,因此 在获取完成之后。
【讨论】:
谢谢林赛。我在函数末尾添加了以下内容。同样,函数内部的 println 是好的,在调用 viewDidLoad 内部的函数并使用 println dispatch_async(dispatch_get_main_queue(), self.myVariable = myParseObject["nameOfColumnOfContainerTheValueToBeReturned"] as String println("异步 = (self.myVariable)") ) @FrancisBeaulieu 是的,我的回答解释了为什么 println 在内部可以,但无法在您的 viewDidLoad 中打印...我不知道我能清楚多少...您不能在执行块后立即在块外执行 println,因为变量还没有准备好。在 viewDidLoad 中的 println 期间,该块仍在后台工作。它需要更多时间。以上是关于Swift - parse.com 的变量范围问题的主要内容,如果未能解决你的问题,请参考以下文章
与 parse.com 的 signUpInBackgroundWithBlock:() 等效的 Swift 2.0 是啥?