swift - swift 从 http sendAsyncRequest 调用中返回数据

标签 swift asynchronous nsurlrequest completionhandler

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

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

在 Controller 中:

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”,所以我假设 callProjectTypes 中的“return data 函数在数据到达之前返回。

我应该怎么做才能使这项工作正常进行?

最佳答案

要异步返回值,您不能使用 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'返回数据后执行。

关于swift - swift 从 http sendAsyncRequest 调用中返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31140152/

相关文章:

arrays - 如何查看图像数组中的下一张图像?

swift - 与社交媒体分享高分

java - 具有变化对象的连续线程

iphone - 如何在 Objective C 中进行 cURL 调用?

ios - 用于在 mapView 上显示标记的 JSON 连接

ios - 为什么 Swift 中的 Apple 示例不适合我?

ios - 通过 segue 问题在 UITableView 和 UIViewController 之间推送数据

c++ - 使用 Boost.ASIO 读取时标准输入管道未关闭

Silverlight 异步设计模式问题

iOS 任何人都知道如何向 NSURLRequest 添加代理?