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 的代码。只是想知道为什么我会收到错误消息:
Thread 6: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP, subcode=0x0).
非常感谢。
最佳答案
您收到此错误是因为响应不是 JSON(或者 JSON 不是字典)。因此,在解析 JSON 时,使用可选绑定(bind)来优雅地处理 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 中的描述在 URL 中包含纬度和经度,否则您将收到非 JSON 错误响应。即使您修复了 URL 以避免此错误,您仍然应该像上面那样实现一些优雅的错误处理,否则您的应用程序可能会在出现任何服务器问题时崩溃。
关于ios - 为什么我的代码在线程 6 : NSOperationQueue? 中运行时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559845/