我目前正在尝试从网址下载,解析和打印JSON。 到目前为止,我已达到这一点:
1)一个类(JSONImport.swift),它处理我的导入:
var data = NSMutableData();
let url = NSURL(string:"http://headers.jsontest.com");
var session = NSURLSession.sharedSession();
var jsonError:NSError?;
var response : NSURLResponse?;
func startConnection(){
let task:NSURLSessionDataTask = session.dataTaskWithURL(url!, completionHandler:apiHandler)
task.resume();
self.apiHandler(data,response: response,error: jsonError);
}
func apiHandler(data:NSData?, response:NSURLResponse?, error:NSError?)
{
do{
let jsonData : NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary;
print(jsonData);
}
catch{
print("API error: \(error)");
}
}
我的问题是
中的数据do{
let jsonData : NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary;
print(jsonData);
}
仍然是空的。 当我调试时,连接成功启动,给定的url作为参数。但是我的jsonData变量没有打印出来。而是catch块抛出错误,声明我的变量中没有数据:
API error: Error Domain=NSCocoaErrorDomain Code=3840 "No value."
有人可以帮我这个吗? 我错过了什么?
非常感谢大家!
[从NSURL Connection切换到NSURLSession后编辑]
答案 0 :(得分:0)
以下是如何使用NSURLSession和非常方便的“完成处理程序”的示例。
此函数包含网络调用并具有“完成处理程序”(数据何时可用的回调):
func getDataFrom(urlString: String, completion: (data: NSData)->()) {
if let url = NSURL(string: urlString) {
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url) { (data, response, error) in
// print(response)
if let data = data {
completion(data: data)
} else {
print(error?.localizedDescription)
}
}
task.resume()
} else {
// URL is invalid
}
}
你可以像这样在新函数中使用它,带有“尾随闭包”:
func apiManager() {
getDataFrom("http://headers.jsontest.com") { (data) in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data, options: [])
if let jsonDict = json as? NSDictionary {
print(jsonDict)
} else {
// JSON data wasn't a dictionary
}
}
catch let error as NSError {
print("API error: \(error.debugDescription)")
}
}
}