5

我将尽力解释这一点。

我正在使用 Parse.com 并从 Parse 数据库类返回数据。我想将此 parse.com 调用放在自定义类中自己的函数中。我遇到的问题是完成。它去哪儿了?我尝试了许多不同版本的将它添加到我的函数中,但它不起作用。

下面是接受类名、表名和排序描述符并返回一个数组的函数:

func queryDataInBackgroundWithBlock(parseClass:String, parseObject:String, sortDescriptor:NSSortDescriptor) -> [Any]

当我将完成添加到它时,我使用(可能不正确):

func queryDataInBackgroundWithBlock(parseClass:String, parseObject:String, sortDescriptor:NSSortDescriptor, completion: (result: Any)->Void)

现在在函数内部,我使用 Parse.com 代码出去获取数据

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

            // Do something with the found objects
            for object in objects {
                self.arrayOfObjects.append(object[parseObject]!)
            }

        } else {
            // Log details of the failure
            println("Error: \(error) \(error.userInfo!)")
        }

    }

我的目标是将参数发送到我的类函数,从 parse.com 获取数据,然后在异步调用之后将数据作为数组返回

我试图这样称呼它:

myClass.queryDataInBackgroundWithBlock("databaseName", parseObject: "columnName", sortDescriptor: orderBy){
    (result: Any) in
    println(result)
}

这几乎就像它是一个嵌套完成。完成后如何返回数组?它是交给然后返回它的函数,还是需要在嵌套代码中返回,还是什么?它检索数据,但问题是完成后的返回。

更新:正如我在下面的评论中所说:

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

        // Do something with the found objects
        for object in objects {
            self.arrayOfObjects.append(object[parseObject]!)
        }

    } else {
        // Log details of the failure
        println("Error: \(error) \(error.userInfo!)")
    }

}, completion: {
     //do something here
})

这将返回错误:“调用中的额外参数完成”我不确定如何在块的末尾添加完成,所以我在块周围添加了 () 并插入了完成。这显然是错误的,但我不确定如何按照 matt 的建议在块的末尾添加完成

更新 2:

    func queryDataInBackgroundWithBlock(parseClass:String, parseObject:String, sortDescriptor:NSSortDescriptor) -> [Any]{
        var query = PFQuery(className:parseClass)

        if sortDescriptor.key != "" {
            query.orderBySortDescriptor(sortDescriptor)
        }

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

                // Do something with the found objects
                for object in objects {
                    self.arrayOfObjects.append(object[parseObject]!!)
                }

            } else {
                // Log details of the failure
                println("Error: \(error) \(error.userInfo!)")
            }

        }

        return self.arrayOfObjects  //<-- needs to move to completion
    }
4

1 回答 1

6

在函数内部,queryDataInBackgroundWithBlock您会收到名称下的完成块completion。它需要一个参数。因此,在获得数据后,您要做的最后一件事就是调用它,并将数据交给它:

completion(result:myData)

而且由于query.findObjectsInBackgroundWithBlock它本身是异步的,因此您需要将该调用作为query.findObjectsInBackgroundWithBlock.

像这样:

func queryDataInBackgroundWithBlock(
    parseClass:String, parseObject:String, sortDescriptor:NSSortDescriptor, 
    completion: (result: Any)->Void) 
{
    var query = PFQuery(className:parseClass)

    if sortDescriptor.key != "" {
        query.orderBySortDescriptor(sortDescriptor)
    }

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

            // Do something with the found objects
            for object in objects {
                self.arrayOfObjects.append(object[parseObject]!!)
            }

        } else {
            // Log details of the failure
            println("Error: \(error) \(error.userInfo!)")
        }
        completion(result:self.arrayOfObjects)
    }

}
于 2014-12-16T05:07:29.990 回答