我目前正在尝试从URL下载,解析和打印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后编辑]
这是有关如何将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)") } } }