【问题标题】:Swift Async completion to return an Array in custom classSwift异步完成以在自定义类中返回一个数组
【发布时间】:2014-12-16 05:02:46
【问题描述】:

我将尽力解释这一点。

我正在使用 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
    }

【问题讨论】:

  • 请完整复制并粘贴到问题中,您对func queryDataInBackgroundWithBlock(parseClass:String, parseObject:String, sortDescriptor:NSSortDescriptor, completion: (result: Any)-&gt;Void)整个实现。
  • 更新的答案 - 你会看到我只是在做我一直说你应该做的事情......

标签: arrays class swift block completion


【解决方案1】:

在函数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)
    }

}

【讨论】:

  • 我实际上不需要将参数传递给完成,所以应该说完成:()->[Any]。 findIbjectsInBackground 是一个 parse.com 函数。我想你是在告诉我把完成放在那里,但我不知道该怎么做
  • 是的,你必须传递一个参数(实际上它是一个参数)。您自己已将completion 声明为具有(result: Any)-&gt;Void 类型。当您调用completion(...) 时,您必须提供result 参数。
  • 看看你上面引用的代码。 正在调用query.findObjectsInBackgroundWithBlock 有一个块。该块是你的代码。我的意思是在最后将completion(...) 的调用放在那里,以表示该块已完成。
  • 我尝试了 20 种不同的方法来做到这一点,但每次都会出错。看起来应该起作用的是 query.findObjectsInBackgroundWithBlock({ BLOCK CODE }, completion: { ... }) 但我收到错误 Extra argument completion in call 告诉我我正在发送findObjectsInBackgroundWithBlack 的完成参数,它是 parse.com 编写的 PFQuery 类的一部分。如果我尝试不使用 () 则错误是 一行上的连续语句必须由 ; 分隔
  • 好吧,那将是另一个问题。您正在犯某种基本的 Swift 语法错误。但这与你提出的问题无关。你问如何做到这一点,根据你提供的信息,我试图帮助你。我不知道您的错误生成代码是什么样的,那么我该如何帮助您呢?如果您遇到语法错误,请尝试实施我所说的实施并提出 new 问题(甚至编辑当前问题)显示您的 actual code 和 实际错误你得到。除非我能看到要更正的代码,否则我无法帮助您更正代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多