class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: "https://api.forecast.io/forecast/MYKEYHERE/")
let session = NSURLSession.sharedSession()
let task: NSURLSessionDownloadTask = session.downloadTaskWithURL(url!, completionHandler: { (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in
if error == nil {
let data = NSData(contentsOfURL: location)
let json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as! NSDictionary!
println(json)
}
})
task.resume()
}
这是针对天气API的下载任务的代码。只是想知道为什么我收到错误:
主题6:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0)。
非常感谢。
答案 0 :(得分:0)
您收到此错误,因为响应不是JSON(或JSON不是字典)。因此,在解析JSON时,使用可选绑定来优雅地处理nil
或非字典错误,如果失败则可能检查响应主体,例如:
let task = session.downloadTaskWithURL(url!) { location, response, error in
if error == nil {
let data = NSData(contentsOfURL: location)
var error: NSError?
if let json = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &error) as? NSDictionary {
println("json = \(json)")
} else {
println("error = \(error)")
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
println("not json; responseString = \(responseString)")
println(response)
}
}
}
task.resume()
另请注意,使用JSONObjectWithData
时,您不仅要优雅地检查错误,而且通常也要使用error
参数,如上所述。
顺便说一句,请确保按照forecast.io
API documentation中的说明在网址中加入纬度和经度,否则您将收到非JSON错误响应。即使你修复了URL以避免这个错误,你仍然应该像上面那样实现一些优雅的错误处理,否则你的应用程序可能会在出现任何服务器问题时崩溃。