【问题标题】:return value from json session to use outside of session从 json 会话返回值以在会话外使用
【发布时间】:2016-08-30 05:01:20
【问题描述】:

我已经搜索了如何做到这一点,但有些东西对我来说没有意义,我做不到。我需要做的就是从我的 json 会话中获取数据(如果这就是你所说的)。我大约 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是什么意思?这是什么意思/信号?

【问题讨论】:

    标签: json swift


    【解决方案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
    }
    

    【讨论】:

    • 我今天早些时候阅读了整个部分,但我仍然不明白如何做我所要求的......这就是我求助于这里的原因。如果您可以更具体地说明哪个部分可能会有所帮助。
    • 我编辑了我的回复,也许现在有意义。如果有帮助,请务必将其标记为最佳答案。谢谢。
    • 谢谢!我编辑了我的代码,它可以工作。我只需要在程序的其余部分开始之前找出如何在程序开头运行此代码,因为程序需要从此 json 解析中填充的所有数据
    猜你喜欢
    • 2011-12-13
    • 2016-09-23
    • 2012-12-08
    • 2016-11-05
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多