意外发现nil - 使用NSURLConnection进行文件上传时出错

时间:2014-09-27 23:22:21

标签: ios swift nsurlconnection

我使用以下函数将图像上传到给定的网址。 我根据这些问题的答案构建了这个函数: NSURLConnection Using iOS SwiftHow to send UIImage in JSON format, by filling a NSDictionary

func uploadFileToUrl(url:NSURL){
    var request = NSMutableURLRequest(URL:url)
    request.HTTPMethod = "POST"
    request.HTTPBody = NSData.dataWithData(UIImagePNGRepresentation(image))

    var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil
    var error: AutoreleasingUnsafeMutablePointer<NSErrorPointer?> = nil

    var dataVal: NSData =  NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error:nil)!


    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

    if (error != nil) {
        println("Request didn't go through")
    }

    println("Synchronous\(jsonResult)")
}

然而,当我运行我的应用程序时,我总是得到一个“致命错误:在展开可选值时意外发现nil”,如下所示:

    var dataVal: NSData =  NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error:nil)!

我做错了什么?感谢

2 个答案:

答案 0 :(得分:2)

首先,您在发出请求时没有传递错误指针,因此您永远不会知道是否失败。

其次,正如已经提到的那样,您在不检查值的情况下强制展开dataVal变量。因此,如果您的请求出错并且您无法处理,那么您最终会得到您显示的错误。

请参阅下面的代码以获取工作示例。

func uploadFileToUrl(url:NSURL){
    var request = NSMutableURLRequest(URL:url)
    request.HTTPMethod = "POST"
    request.HTTPBody = NSData.dataWithData(UIImagePNGRepresentation(image))

    var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil
    var HTTPError: NSError? = nil
    var JSONError: NSError? = nil

    var dataVal: NSData? =  NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error: &HTTPError)

    if ((dataVal != nil) && (HTTPError == nil)) {
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal!, options: NSJSONReadingOptions.MutableContainers, error: &JSONError) as NSDictionary

        if (JSONError != nil) {
            println("Bad JSON")
        } else {
            println("Synchronous\(jsonResult)")
        }
    } else if (HTTPError != nil) {
        println("Request failed")
    } else {
        println("No Data returned")
    }
}

答案 1 :(得分:1)

如果出现问题,NSURLConnection.sendSynchronousRequest将返回nil。你确实有问题,它返回零。然后用你的感叹号用力展开那个零。因此崩溃。

相反,请将dataVal键入NSData?,这是您要获取的内容(并删除感叹号)。现在你不会崩溃。现在在下一行中查看dataVal是否为零。如果是,您知道自己遇到了问题,现在您可以阅读错误以查看问题所在。

如果不是,现在你可以打开它并将其交给NSJSONSerialization进行解释。