Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在NSURLConnection函数之外无法访问词典的内容_Ios_Json_Swift_Rest - Fatal编程技术网

Ios 在NSURLConnection函数之外无法访问词典的内容

Ios 在NSURLConnection函数之外无法访问词典的内容,ios,json,swift,rest,Ios,Json,Swift,Rest,我有一个函数,它接收字符串并返回通过URL请求填充的字典。My函数将字符串分配给JSON对象,使用SwiftyJSON检索。属性已更新,但在退出NSURLConnection.sendAsynchronousRequest函数时,它们将不可访问 因此,对于1、2和3printlns,数组可以正确打印,但不能在4上打印。代码如下: func parseJSON(id:String) -> Dictionary<String, JSON> { var properties

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

因此,对于1、2和3
println
s,数组可以正确打印,但不能在4上打印。代码如下:

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
}
func-parseJSON(id:String)->字典{
var属性=[String:JSON]()
var postEndpoint=”http://localhost:3000/properties/\(id)”
var urlRequest=NSURLRequest(URL:NSURL(字符串:postEndpoint)!)
NSURLConnection.sendAsynchronousRequest(urlRequest,队列:NSOperationQueue(),completionHandler:{
(响应:NSURLResponse!、数据:NSData!、错误:NSError!)->在中无效
如果让A出错=错误{
println(“调用GET on/properties/\(id)时出错”)
}
否则{
让post=JSON(数据:data)
如果let title=post[“name”].string{
对于post中的(index:String,subson:JSON){
属性[索引]=子对象
}
println(“1:\(属性)”)
}
否则{
println(“在/posts上解析来自POST的响应时出错”)
}
println(“2\(属性)”)
}
println(“3\(属性)”)
})
println(“4\(属性)”)
返回DS1属性
}

还需要注意的是,4在1、2和3之前打印出来,这使我认为
NSURLConnection
是稍后调用的,因此返回值在离开
parseJSON
函数之前不会更新。

您需要了解异步的含义以及如何异步编程

对于异步代码,每一行不是一行接一行地执行,而是并行执行

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

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


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

您的web请求是异步完成的。4首先打印,因为web请求需要时间。一旦请求完成,就会调用完成块。那么,在没有等待web请求完成的情况下,如何防止函数返回?您不应该延迟它返回。这是非常糟糕的,更糟糕的事情。你应该去读一读异步与同步的背景知识,然后问更多的问题。目前,您的知识太基础,无法为您提供解决方案。您需要首先做好准备。有许多工具可供您正确处理异步请求。您可以从完成块调用一个函数,该函数将执行JSON所需的任何操作。您可以发布json已完成的通知,并让侦听器处理它。然而,像网络呼叫这样的事情是异步的,这是有原因的,你不应该尝试去对抗它。对不起,我说错了。我熟悉同步和异步请求的概念。当我说“阻止返回”时,我的意思是在函数返回之前,我应该使用什么替代方法来访问数据。我将使用同步调用重做此操作。谢谢你的帮助!