gpt4 book ai didi

ios - 为什么我的代码在线程 6 : NSOperationQueue? 中运行时崩溃

转载 作者:行者123 更新时间:2023-11-28 09:06:58 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com