时间:2015-05-25 22:28:38

标签: swift

我在执行闭包后难以分配值。

问题出在//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
}

2 个答案:

答案 0 :(得分:1)

您的网络请求是异步请求。这意味着它将完成,并且将在未来的某个时刻调用完成块。在你调用jsonQuery.resume()之后很长一段时间。整个函数返回后很长一段时间。

你的变量在通话结束后没有回到零 - 你在它被设置为零之前很久就检查了它。完成块的工作是执行处理数据和存储结果所需的所有操作。

答案 1 :(得分:0)

您的“步骤5”可能会在步骤3或4之前执行。调用 resume 不会阻止并等待响应竞争,因此您在调用完成块之前执行步骤5。