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 的变量范围问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift 范围界定问题

从 Parse.com (Swift) 检索数据

与 parse.com 的 signUpInBackgroundWithBlock:() 等效的 Swift 2.0 是啥?

Parse.com 多用户访问数据 - Swift

Swift 无法从 parse.com 检索图像

如何使用 Swift 2.0 在 Parse.com (REST API) 中上传图像并将其与用户关联