我有一个函数,它接受一个字符串并返回一个通过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
函数。
答案 0 :(得分:0)
您需要了解异步意味着什么,以及如何异步编程。
使用异步代码,每行不会一个接一个地执行,它们是并行执行的。
当你调用parseJSON()时,它会立即完成并返回,但在其中你已经调用了sendAsynchronousRequest。这会启动另一个并行运行的线程(你知道线程是什么吗?)。此线程可能无法完成几秒钟。因此,步骤1,2和3可能会在步骤4之后的几秒钟内执行。
你不能将asynchonrous函数放在这样的同步函数中,并期望它像“普通”函数一样工作。您需要设计代码来处理这种情况,包括调用parseJSON的代码 - 因为解析可能需要几秒钟,因此代码需要等待。如果您的应用程序具有GUI,那么如果您没有正确执行此操作,则整个应用程序将挂起并冻结。
因此,当您使用异步性编写时,您的整个应用程序必须设计为正确处理它。