0

好的,首先,我已经阅读了有关该主题的其他几篇文章,并且我知道我要描述的可能是同步调用,但我真正需要的是获取数据并使用它,所以如果我应该看在其他方向让我知道:

我必须调用 api 来检索 json 对象并使用它们来填充表视图。我的问题是我无法传递/返回数据以使用它:

在控制器中:

callProjectTypes()
var testjson = JSON(data:test)
println("should print some data")
println(testjson[0])

调用函数:

func callProjectTypes() -> (NSData) {

        var data = NSData()

        serverCall("http://url/to/project/types") {
            responseData, error in

            if responseString == nil {
                println("Error during post: \(error)")
                return
            }

            // use responseData here
            data = responseData
        }

        return data

    }

func serverCall(url: String, completionHandler: (responseData: NSData!, error: NSError!) -> ()) {
        var URL: NSURL = NSURL(string: url)!
        var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL)
        request.HTTPMethod = "GET";

        var creds = encodeCredentials()
        request.addValue("\(creds)", forHTTPHeaderField: "Authorization")

        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){

            response, data, error in

            var output: NSData!

            if data != nil {
                output = data
            }

            completionHandler(responseString: output, error: error)
        }
    }

println(testjson[0])总是返回“ nill”,所以我假设return data我的callProjectTypes函数中的“”在数据到达之前返回。

我应该怎么做才能完成这项工作?

4

2 回答 2

2

要异步返回值,您不能使用 return 语句,因为您无法保证在执行 return 语句时 'serverCall' 将完成。相反,您必须以异步方式返回“数据”值,例如通过向“callProjectTypes”本身提供回调。例子:

callProjectTypes()
{
    (data : NSData) in
        let testjson = JSON(data:data)
        println("should print some data")
        println(testjson[0])
}

异步函数必须接受并执行回调:

func callProjectTypes(callback: (data : NSData)->Void)
{
    serverCall("http://url/to/project/types") {
        responseData, error in

    callback(responseData)
}

现在你可以保证回调中的代码只有在'serverCall'返回数据后才会执行。

于 2015-06-30T14:29:02.727 回答
0

您不能使用异步返回这种方式。

你必须对闭包内的数据做所有你需要的事情。

你必须这样做:

func callProjectTypes(action: NSData->()) {
    serverCall("http://url/to/project/types") { responseData, error in
        if responseData == nil {
            println("Error during post: \(error)")
            return
        }

        action(responseData)
    }
}

callProjectTypes { data in
    let testjson = JSON(data:data)
    println("should print some data")
    println(testjson[0])
}
于 2015-06-30T14:24:13.170 回答