【问题标题】:unexpectedly found nil - error on File Upload with NSURLConnection意外发现 nil - 使用 NSURLConnection 上传文件时出错
【发布时间】:2018-12-05 21:29:03
【问题描述】:

我正在使用以下函数将图像上传到给定的 url。 我根据对这些问题的回答构建了这个函数: 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)!

我做错了什么?谢谢

【问题讨论】:

    标签: ios swift nsurlconnection


    【解决方案1】:

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

    其次,如前所述,您在不检查值的情况下强制解开 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")
        }
    }
    

    【讨论】:

    • 我正在输入 var url = NSURL(string: "my/url") 然后正是您的代码并获得实时构建错误:可选类型 NSURL 的值?未解包;您的意思是使用! 或 ?。如果我添加一个 !,那么我会在 NSData.dataWithData 行上得到一个错误。如果我做出建议的更改,我会得到致命错误:在调用函数时展开可选值时意外发现 nil。回到正方形一、有什么想法吗?
    【解决方案2】:

    如果有问题,NSURLConnection.sendSynchronousRequest 返回 nil。你确实有问题,它返回 nil。然后,您将使用感叹号强制解开该 nil 。因此崩溃。

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多