Skip to main content
 首页 » 操作系统

ios之意外发现 nil之使用 NSURLConnection 上传文件时出错

2024年01月01日46birdshome

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

但是,当我运行我的应用程序时,我总是在以下行中收到“ fatal error :在展开可选值时意外发现 nil”:

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

我做错了什么?谢谢

请您参考如下方法:

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

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