Ios Alamofire在展开可选值时意外发现nil
我使用这个Alamofire代码下载URL的图像Ios Alamofire在展开可选值时意外发现nil,ios,swift,alamofire,Ios,Swift,Alamofire,我使用这个Alamofire代码下载URL的图像 func getImage(imageUrlString: String, completionHandler: (responseObject: UIImage?, error: NSError?) -> ()) { makeGetImageCall(imageUrlString, completionHandler: completionHandler) } func makeGetImageCall(
func getImage(imageUrlString: String, completionHandler: (responseObject: UIImage?, error: NSError?) -> ()) {
makeGetImageCall(imageUrlString, completionHandler: completionHandler)
}
func makeGetImageCall(imageUrlString: String, completionHandler: (responseObject: UIImage?, error: NSError?) -> ()) {
//Perform request
print("Trying to get: " + imageUrlString)
Alamofire.request(.GET, imageUrlString, headers: ["Authorization": NSUserDefaults.standardUserDefaults().stringForKey("BasicAuthenticationString")!])
.responseImage { request, response, result in
print(request)
print(response)
print(result)
completionHandler(responseObject: result.value, error: nil)
}
}
这是我使用以下方法的类:
public class NewsListEntry: NSObject {
public var thumbnail: String = ""
public var thumbnailImage: UIImage = UIImage()
public var thumbnailDownloaded: Bool = false
public func downloadThumbnail() {
print(self.title)
GetImageHandeler().getImage(self.thumbnail, completionHandler: { (responseObject, error) in
})
}
}
然后我得到一个:
fatal error: unexpectedly found nil while unwrapping an Optional value
我做错了什么
这是我得到的错误:
我做错了什么
两件事。首先,您正在某处使用“力展开”操作符,可能在此处:
NSUserDefaults.standardUserDefaults().stringForKey("BasicAuthenticationString")!
这意味着您要保证返回值不是nil
,但在本例中,它是。因为你违背了诺言,应用程序崩溃了
其次,请不要将授权字符串存储在NSUSERDEFAULTS中。iOS拥有高度安全的钥匙链是有原因的<代码>NSUserDefaults不提供加密。请用钥匙链。有像and这样的包装库可以帮助您。您在不检查结果是否有效的情况下展开结果。添加以下代码:
Alamofire.request(.GET, imageUrlString, headers: ["Authorization": NSUserDefaults.standardUserDefaults().stringForKey("BasicAuthenticationString")!])
.responseImage { request, response, result in
print(request)
print(response)
print(result)
switch result {
case .Success(let value):
completionHandler(responseObject: value, error: nil)
case .Failure(_, let error):
completionHandler(responseObject: nil, error: error)
}
}
如果使用Swift 2,您需要将
completionHandler
块的error
参数从NSError?
更改为ErrorTypeNSUserDefaults.standardUserDefaults().stringForKey(“基本验证字符串”)
可能是nil
。添加了一个打印,它不是nil。它适用于6个图像,然后我得到了错误,当我得到错误时,URL是有效的。这是我看到强制展开的代码的唯一部分,因此它必须是nil才能给出此特定错误消息。除非这个错误发生在我们在这个问题中没有看到的另一行代码上?在这种情况下,请用所有相关的代码和信息编辑您的问题。我已经为错误添加了两个屏幕截图,我不知道如何在代码中看到错误发生的位置?我为BasicAuthenticationString添加了打印,它永远不会为零。所以这一定是其他原因,但我看不出我在使用任何其他强制展开。我为错误添加了两个屏幕截图,我不知道如何查看代码中发生错误的位置?设置异常断点以查看错误发生的位置:我得到的exc_breakpoint code=1与提供的屏幕截图中的相同,即使有异常断点。@LordVermillion可能imageUrlString
无效。你可以发布日志跟踪吗?字符串是有效的,如果我把它放在浏览器中,我会得到图像。