我在执行闭包后难以分配值。
问题出在//step4
。它打印内容并且它没有捕获,
但是在//step5
,它会打印Nil。
我尝试创建一个类并在HTTP请求中分配值,但没有更改。
我的代码:
var x: String!override func viewDidLoad() {
super.viewDidLoad()
//1
let urlAsString = "http://date.jsontest.com/"
let url = NSURL(string: urlAsString)!let urlSession = NSURLSession.sharedSession()
//2
let jsonQuery = urlSession.dataTaskWithURL(url, completionHandler: {
data, response, error - > Void in
if error != nil {
println(error.localizedDescription)
}
var err: NSError ?
//3
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: & err) as!NSDictionary
if err != nil {
println("JSON Error \(err!.localizedDescription)")
}
//4
let jsonDate = jsonResult["date"] as!String
let jsonTime = jsonResult["time"] as!String
//Step 4
//let's Assume
x = jsonDate
println("Inside \(x)") // Prints Date :)
dispatch_async(dispatch_get_main_queue(), {
self.dateLabel.text = jsonDate
self.timeLabel.text = jsonTime
})
}) //end of JsonQuery
jsonQuery.resume()
//Step 5
println("Outside \(x)") // Prints nil
}
答案 0 :(得分:1)
您的网络请求是异步请求。这意味着它将完成,并且将在未来的某个时刻调用完成块。在你调用jsonQuery.resume()之后很长一段时间。整个函数返回后很长一段时间。
你的变量在通话结束后没有回到零 - 你在它被设置为零之前很久就检查了它。完成块的工作是执行处理数据和存储结果所需的所有操作。
答案 1 :(得分:0)
您的“步骤5”可能会在步骤3或4之前执行。调用 resume
不会阻止并等待响应竞争,因此您在调用完成块之前执行步骤5。