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
})

これはエラーを返しています:「呼び出しで余分な引数の補完」ブロックの最後に補完を追加する方法がわからないので、ブロックの周りに () を追加して補完を挿入しました。これは明らかに間違っていますが、マットが提案したようにブロックの最後に補完を追加する方法がわかりません

更新 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。1 つのパラメータを取ります。したがって、データを取得した後、最後に行うことは、それを呼び出してデータを渡すことです。

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 に答える