【问题标题】:Create API Class to handle JSON Data Swift创建 API 类来处理 JSON 数据 Swift
【发布时间】:2015-05-07 09:53:59
【问题描述】:

我对在 Swift 中处理 JSON 数据非常陌生,而且对 Swift 几乎同样陌生。在 Playground 中,我编写了一大堆解析 JSON 数据的代码。

但是我意识到我不想将此代码复制并粘贴到每个仅使用部分数据的视图控制器中。我想创建一个处理 json 数据的自定义类。

这是我的一些代码:

var status: String!
var message: String!
var code: Int!
var dataArray: [NSDictionary]!
var responseCode: String!


var url: NSURL!
var session: NSURLSession!



url = NSURL(string: "http://thisappgonnabecoool.json")

session = NSURLSession.sharedSession()


let task = session.dataTaskWithURL(url!, completionHandler: { data, response, error -> Void in
if (error != nil) {
    // println(error)

} else {
    let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary




    status = jsonResult["status"] as! String
    message = jsonResult["message"] as! String
    code = jsonResult["code"] as! Int
    dataArray = jsonResult["data"] as! [NSDictionary]


}

})
task.resume()

然后我尝试创建一个这样的类:

class JsonClass {

var status: String!
var message: String!
var code: Int!
var dataArray: [NSDictionary]!
var responseCode: String!


var url: NSURL!
var session: NSURLSession!


init() {
 url = NSURL(string: "http://thisappgonnabecoool.json")

session = NSURLSession.sharedSession()


let task = session.dataTaskWithURL(url!, completionHandler: { data, response, error -> Void in
if (error != nil) {
    // println(error)

} else {
    let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary




    status = jsonResult["status"] as! String
    message = jsonResult["message"] as! String
    code = jsonResult["code"] as! Int
    dataArray = jsonResult["data"] as! [NSDictionary]


}

})
task.resume()


}

我认为在新课程中我可以做这样的事情:

let jsonAPI = JsonClass()
println(jsonAPI.status)
println(jsonAPI.message)

等等……

但是,任何访问 JsonClass 实例的尝试都会导致每个 JsonClass 属性的值为 nil。

使用此类的实例访问这些数据的下一步是什么?

【问题讨论】:

  • 您应该在此类中创建一个用于开始下载的方法。它应该有一个完成块,您可以在 dataTaskWithURL:completionHandler: 方法的完成处理程序中调用它。
  • 为什么不使用 SwiftyJSON 和 Alamofire?
  • 这听起来确实像解决方案,您能否提供一个示例供参考?它会帮助我,我相信其他人也会受益@rdelmar
  • 我没有用 Swift 编写的示例。这里有这个想法的 Objective-C 实现,stackoverflow.com/questions/25669761/…

标签: ios json class swift


【解决方案1】:

您的问题与解析 JSON 无关。您的问题是您有一个异步调用,并且在您查看结果时异步调用尚未完成。

dataTaskWihURL 的完成处理程序可以在 init() 调用返回后半秒、五秒或六十秒后调用。

【讨论】:

  • 是的,听起来解决方案是调用完成处理程序,但我不确定我知道该怎么做
【解决方案2】:

非常感谢大家。我发布了我的 API 示例作为答案,因为它是最完整的答案。

如前所述,我的问题不在于解析,它与在调用 init() 返回后调用 dataTaskWithURL 的事实有关。我通过向我用来下载数据的方法添加完成处理程序解决了这个问题。

class JsonAPI {


var status: String!
var message: String!
var code: Int!
var dataArray: [NSDictionary]!
var responseCode: String!

var url: NSURL!
var session: NSURLSession!


func getData(completionHandler: ((NSArray!, NSError!) -> Void)!) -> Void {


    url = NSURL(string: "myapp.json")

    session = NSURLSession.sharedSession()


    let task = session.dataTaskWithURL(url!, completionHandler: { data, response, error -> Void in
        if (error != nil) {
            // println(error)
//If there is an error, return nil for the data, and error for the error
            return completionHandler(nil, error)

        } else {
            let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary

            self.status = jsonResult["status"] as! String
            self.message = jsonResult["message"] as! String
            self.code = jsonResult["code"] as! Int
            self.dataArray = jsonResult["data"] as! [NSDictionary]

        }
//If there aren't errors, return whatever you parsed as the data, and nil for error
        return completionHandler(self.dataArray, nil)
    })
    task.resume()

}


}

我从不同的类中调用 getData() 方法,如下所示:

var api = JsonAPI()

api.getData({data, error -> Void in
        if (data != nil) {
            self.newDataArray = data


        } else {
            println("api.getData failed")
            println(error)
        }
    })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2011-10-18
    • 2021-04-22
    相关资源
    最近更新 更多