在完全执行函数之前返回值

时间:2015-01-08 22:27:51

标签: ios swift parse-platform

我有一个如下所示的功能

func getRecipeArray(name:String) -> [String] {
    var query = PFQuery(className: name)
    query.selectKeys(["Recipe_Name"])
    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil {

            NSLog("Successfully retrieved \(objects.count) scores.")
            for object in objects {
                var name: String = object.objectForKey("Recipe_Name")! as String
                self.dummyArray.append(name)

                }

        } else {

                NSLog("Error: %@ %@", error, error.userInfo!)

            }
    }

    println(self.dummyArray.count)
    println(self.dummyArray)
    return self.dummyArray
}

从解析中检索Recipe_name后,它应该返回数组。 但它只返回一个值,然后执行findObjectsInBackgroundWithBlock函数。

在控制台中,它打印如下所示的值

1 [] 2015-01-08 16:15:27.922 IndianFood [2268:67055] 成功检索了2个分数。

请帮我解决此问题。

1 个答案:

答案 0 :(得分:1)

query.findObjectsInBackgroundWithBlock是一个在后台线程中执行的异步方法。只有在后台线程完成下载并查找数据后才会分配self.dummyArray。但是您的函数将在块完成执行之前返回。

您需要做的是,在query.findObjectsInBackgroundWithBlock块中执行您想要的任何操作,以便它只在后台线程完成其操作后执行。请注意,任何需要UI更新的操作都必须在主线程中完成。虚拟代码如下。

query.findObjectsInBackgroundWithBlock {
     (objects: [AnyObject]!, error: NSError!) -> Void in
       if error == nil {

         otherfunctions()

         dispatch_async(dispatch_get_main_queue(), 
         {
             // UI updates like
             // label.text = object["name"]
         })
     }
}