我非常擅长在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。
我使用此类实例访问此数据的后续步骤是什么?
答案 0 :(得分:4)
您的问题与解析JSON没有任何关系。您的问题是您有异步调用,并且在您查看结果时未完成异步调用。
在调用init()返回后,可以调用dataTaskWihURL的完成处理程序半秒,五秒或六十秒。
答案 1 :(得分:0)
非常感谢大家。我发布了一个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)
}
})