我使用以下函数将图像上传到给定的网址。 我根据这些问题的答案构建了这个函数: 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)")
}
然而,当我运行我的应用程序时,我总是得到一个“致命错误:在展开可选值时意外发现nil”,如下所示:
var dataVal: NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error:nil)!
我做错了什么?感谢
答案 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进行解释。