json - 从 json session 返回值以在 session 外使用

标签 json swift

我已经搜索过如何做到这一点,但有些东西对我来说没有意义,我做不到。我需要做的就是从我的 json session 中获取数据(如果那是你所说的)。我大约 3 周前开始编程,所以我需要外行术语。我意识到这可能会被标记为重复,但关于这个/相关主题的大部分答案都是针对其他语言的,我几乎不懂 swift,所以它们对我帮助不大。

我花了几个小时试图找到答案,但由于我是新手,所以我不知道我正在搜索的内容是否是正确的搜索结果。我也试过阅读 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) 分配给我的全局变量 (heroes),因为这是一个异步请求,所以它只返回 nil,因为在请求完成之前调用了命令。我想我必须使用完成处理程序或回调函数。我真的不明白它们之间的区别,也不明白如何在哪里实现它们。

另外,这段代码我也不是很懂,我只知道需要得到我想要的。

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

“(data: NSData?, response:NSURLResponse?, error: NSError?)” 看起来像参数,但它们似乎没有附加到函数上,所以这对我来说没有意义

“-> Void”对我来说没有意义,因为 -> 意味着返回后面的任何内容,但 void 向我表明它什么都不返回,所以为什么不把它一起去掉呢?

"-> Void in"这里的in有什么意义呢?这是什么意思/信号?

最佳答案

去阅读关于 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
}

关于json - 从 json session 返回值以在 session 外使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219063/

相关文章:

php - 如何创建 JSON (jQuery),发布整个数组

javascript - JSON 到表格格式并填充空白

.NET 将 JSON 反序列化为多种类型

arrays - 排序数组返回错误值

swift - RxSwift 测试现在失败。引入了延迟

javascript - 406( Not Acceptable ).尝试使用@Responsebody从spring处理函数返回对象或整数到ajax请求

JSON Schema 比较两个属性为等长数组

swift - SpriteKit 并以编程方式绘制简单图形

ios - 如何将 MKMapItem 转换为二进制数据存储在 Core Data 中?

ios - 如何使用手动UITabbar并使用它来切换其他ViewController?