【问题标题】:Swift - Issue with variable scope with parse.comSwift - parse.com 的变量范围问题
【发布时间】:2015-03-17 02:48:00
【问题描述】:

自从 Swift 调用 parse.com 类 2 天以来,我一直在努力解决一个问题。

  1. 我在 UIViewController 类的根目录中声明了一个变量

    var myVariable: 字符串?

  2. 我创建了一个函数来调用数据库并返回一个值

    函数检索数据() {

        // 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)")

        }

感谢您的帮助!

【问题讨论】:

    标签: ios swift xcode6


    【解决方案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 期间,该块仍在后台工作。它需要更多时间。
    猜你喜欢
    • 2016-08-30
    • 2011-11-21
    • 2011-04-13
    • 2011-10-20
    • 2016-06-21
    • 2011-04-10
    • 2011-08-11
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多