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

标签 ios swift nsurlsessiondownloadtask

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/

相关文章:

javascript - 文本字段的条件是焦点

ios - Swift UITableView 删除所选行及其上方的任何行

ios - NSURLSession 后台 session 的正确用例是什么?

ios - Swift:URLSessionDownload 文件说它存在但实际上不存在?

ios - 快速下载任务与请求文件下载不起作用

ios - AVAnimator Mvid转换

iOS 推送通知不适用于 Firebase

ios - 折叠可折叠部分标题时下拉 UITableView 表标题

ios - 尽管属性已更改,但应用程序不会立即更新 View

swift - 更改所选 UICollectionView 单元格的大小