使用NSURLConnection发送异步时的EXC_BAD_INSTRUCTION

时间:2014-06-20 10:56:18

标签: swift

这个功能有一个奇怪的问题:

func retrieveToken() {
        var postRequest = NSMutableURLRequest(URL: NSURL(string: "http://example.com"));
        postRequest.HTTPMethod = "POST"
        var responseData = NSMutableData();
        NSURLConnection.sendAsynchronousRequest(postRequest, queue: NSOperationQueue.mainQueue(), completionHandler: { (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            responseData = NSMutableData(data:data);
            })
        var responseDict:Dictionary<String,AnyObject> = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: nil) as Dictionary;
    }

此函数应该向URL发送POST请求(有效)以接收令牌。但是,由于某种原因,当我运行此代码时,我在将postRequest的HTTPMethod设置为POST的行中获得了EXC_BAD_INSTRUCTION。我觉得我忽略了一些非常明显的东西,但我看不清楚是什么。有什么问题?

2 个答案:

答案 0 :(得分:1)

你忽略了(至少)两个要点。

  1. 您在完成处理程序中传递的数据是可选的,因此您需要做好准备,使其为零。
  2. 您的NSJSONSerialization在调用sendAsynchronousReguest后立即执行,并且此时将不会调用完成处理程序。
  3. 这些问题中的第一个很可能会导致您遇到的崩溃,因为您在某个时候尝试取消引用data,但它恰好是零。但可能是NSJSONSerialization不喜欢传递空的NSMutableData实例。

    阅读Optionals,然后阅读异步编程,然后再看看你想要实现的目标。只需使用同步网络请求就会导致糟糕的用户体验,因为界面冻结等待您的网络请求完成。

答案 1 :(得分:0)

我通过使用sendSynchronousRequest修复了问题:

responseData = NSURLConnection.sendSynchronousRequest(postRequest, returningResponse: nil, error: nil) as NSData;