当我在线程6中运行它时,为什么我的代码崩溃了:NSOperationQueue?

时间:2015-05-31 16:37:05

标签: 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的下载任务的代码。只是想知道为什么我收到错误:

  

主题6:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0)。

非常感谢。

1 个答案:

答案 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以避免这个错误,你仍然应该像上面那样实现一些优雅的错误处理,否则你的应用程序可能会在出现任何服务器问题时崩溃。