使用NSURLSession下载JSON不会返回任何数据
我目前正在尝试从URL下载,parsing和打印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); }
仍然是空的。 当我debugging时,连接启动成功,给定的url作为参数。 但我的jsonDatavariables不会被打印。 相反,catch块会抛出错误,指出我的variables中没有数据:
API error: Error Domain=NSCocoaErrorDomain Code=3840 "No value."
有人可以帮我这个吗? 我错过了什么?
非常感谢您提前!
[从NSURL连接切换到NSURLSession之后编辑]
下面是一个关于如何使用非常方便的“完成处理程序”使用NSURLSession的例子。
该函数包含networking调用,并具有“完成处理程序”(数据可用时的callback):
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)") } } }