在NSURLConnection函数之外无法访问的Dictionary的内容

时间:2015-06-26 19:19:38

标签: ios json swift rest

我有一个函数,它接受一个字符串并返回一个通过URL请求填充的字典。我的函数将字符串分配给JSON对象,使用SwiftyJSON检索。属性已更新,但在退出NSURLConnection.sendAsynchronousRequest函数时,它们无法访问。

因此对于1,2和3 println s,数组正确打印出来,但不打印出来。这是代码:

func parseJSON(id:String) -> Dictionary<String, JSON> {
    var properties = [String:JSON]()
    var postEndpoint = "http://localhost:3000/properties/\(id)"
    var urlRequest = NSURLRequest(URL: NSURL(string: postEndpoint)!)

    NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue(), completionHandler: {
        (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        if let anError = error {
            println("error calling GET on /properties/\(id)")
        }
        else {
            let post = JSON(data: data)
            if let title = post["name"].string {
                for (index: String, subJson:JSON) in post {
                    properties[index] = subJson
                }
                println("1: \(properties)")
            }
            else {
                println("error parsing response from POST on /posts")
            }
            println("2 \(properties)")
        }
        println("3 \(properties)")
    })
    println("4 \(properties)")
    return ds1Properties
}

同样重要的是要注意4在1号,2号和3号之前打印出来,这让我觉得NSURLConnection稍后会被调用,所以返回值在它离开之前不会被更新parseJSON函数。

1 个答案:

答案 0 :(得分:0)

您需要了解异步意味着什么,以及如何异步编程。

使用异步代码,每行不会一个接一个地执行,它们是并行执行的。

当你调用parseJSON()时,它会立即完成并返回,但在其中你已经调用了sendAsynchronousRequest。这会启动另一个并行运行的线程(你知道线程是什么吗?)。此线程可能无法完成几秒钟。因此,步骤1,2和3可能会在步骤4之后的几秒钟内执行。

你不能将asynchonrous函数放在这样的同步函数中,并期望它像“普通”函数一样工作。您需要设计代码来处理这种情况,包括调用parseJSON的代码 - 因为解析可能需要几秒钟,因此代码需要等待。如果您的应用程序具有GUI,那么如果您没有正确执行此操作,则整个应用程序将挂起并冻结。

因此,当您使用异步性编写时,您的整个应用程序必须设计为正确处理它。