从json会话返回值以在会话之外使用

时间:2016-08-30 05:01:21

标签: json swift

我已经搜索过如何做到这一点,但对我来说并不合适,我无法做到。我需要做的就是从我的json会话中获取数据(如果这就是你所说的)。我大约3周前就开始编程了,所以我需要请求人员。我意识到这可能会被标记为重复,但是这个/相关主题的大部分答案都是针对其他语言的,我几乎听不懂,所以他们不会帮助我。

我花了好几个小时试图找到答案,因为我是新手,我不知道我搜索的内容是否是正确的搜索内容。我也试过阅读iOS开发者库,但要么我不明白它告诉我什么,要么我找不到合适的部分,因为我仍然无法理解这一点出。请尝试解释这一点,而不是让我去阅读其他资源。

这是我的功能

func parseData() {

let urlString = "http://heroesjson.com/heroes.json"
let session = NSURLSession.sharedSession()
let url = NSURL(string: urlString)!

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in

    guard let responseData = data else { return }
    var json: [[String: AnyObject]]!

    do {
        json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! [[String: AnyObject]]
    }
    catch {
        //handle error
    }

    var arrayToReturn = [Hero]()
    for element in json {
        let hero = Hero(fromDictionary: element as! [String: AnyObject])
        arrayToReturn.append(hero)
    }
    }.resume()//Closes Session.dataTaskWithURL
} //Closes parseData()

目标是在我的do语句中获取json变量,这样我就可以在函数外部解析它或者得到我的" arrayToReturn"所以我可以将它保存到我使用的全局变量中。

如果我理解正确,我不能将值(arrayToReturn)分配给我的全局变量(英雄),因为这是一个异步请求,所以它只返回nil,因为在请求完成之前调用了该命令。我想我必须使用完成处理程序或回调函数。我不太了解它们之间的区别,也不了解如何 来实现它们。

另外,我也不太了解这段代码,我只知道得到我想要的东西是必要的。

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in

"(数据:NSData?,响应:NSURLResponse?,错误:NSError?)"看起来像参数,但它们似乎并没有附加到一个功能,所以对我来说没有意义

" - >空隙"对我没有意义因为 - >意味着返回后面的内容,但是void告诉我它什么也没有返回,所以为什么不把它一起留下来呢?

" - > in "在这里有什么意义?什么意思/信号?

1 个答案:

答案 0 :(得分:1)

去阅读Swift Closures。要使用它之外的值,您需要将它传递给另一个闭包。

func parseData(callback: (heroes: [Hero]) -> Void) {

let urlString = "http://heroesjson.com/heroes.json"
let session = NSURLSession.sharedSession()
let url = NSURL(string: urlString)!

session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in
    guard let responseData = data else { return }
    var json: [[String: AnyObject]]!

    do {
        json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! [[String: AnyObject]]
    }
    catch {
        //handle error
    }

    var arrayToReturn = [Hero]()
    for element in json {
        let hero = Hero(fromDictionary: element as! [String: AnyObject])
        arrayToReturn.append(hero)
    }

    callback(heroes: arrayToReturn)
    }.resume()//Closes Session.dataTaskWithURL
} //Closes parseData()

你打电话给它:

parseData { heroes in
    // do something with the array
}