我使用此Alamofire代码下载URL
的图像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
我做错了什么?
这是我得到的错误:
答案 0 :(得分:1)
我做错了什么?
两件事。首先,你在某处使用force-unwrap运算符,可能在这里:
NSUserDefaults.standardUserDefaults().stringForKey("BasicAuthenticationString")!
这意味着您确保返回值不是nil
,但在这种情况下,确实如此。{p>}由于你违背了承诺,应用程序崩溃了。
其次, 请不要存储NSUSERDEFAUL中的授权字符 。 iOS有一个高度安全的钥匙串是有原因的。 NSUserDefaults
不提供加密。请使用钥匙串。有一些包装库,如Locksmith和SSKeychain,可以为您提供帮助。
答案 1 :(得分:1)
您正在展开结果而不检查结果是否有效。添加以下代码:
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,则需要将error
块的completionHandler
参数从NSError?
更改为ErrorType
。