【问题标题】:Return data out of http sendAsyncRequest call in swift快速从 http sendAsyncRequest 调用中返回数据
【发布时间】:2015-06-30 13:51:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: swift asynchronous nsurlrequest completionhandler


    【解决方案1】:

    要异步返回值,您不能使用 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)
    }
    

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

    【讨论】:

    • 似乎工作正常。有一个小错字: let testjson = JSON(data:test) 应该让 testjson = JSON(data:data) 根据您的示例。非常感谢这对我帮助很大!
    【解决方案2】:

    你不能使用异步返回那种方式。

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

    你必须这样做:

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

    【讨论】:

      猜你喜欢
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多