Return 数据来自 swift 中的 http sendAsyncRequest 调用

Return data out of http sendAsyncRequest call in swift

好的,首先,我已经阅读了其他几本关于这个主题的 post,我知道我要描述的可能是一个同步调用,但我真正需要的是获取数据和使用它,所以如果我应该从其他方向看,请告诉我:

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

在控制器中:

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]) 总是 return "nill" 所以我假设 callProjectTypes 函数中的 "return data" 在数据到达之前返回。

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

你不能return那样使用异步。

您必须对闭包中的数据执行所需的所有操作。

你必须这样做:

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

到 return 值异步你不能使用 return 语句,因为你不能保证 'serverCall' 在执行 return 语句时已经完成。相反,您必须以异步方式 return 'data' 值,例如通过向 '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'return编辑后执行。