在打开Optional值时,Alamofire意外地发现了nil

时间:2015-09-21 14:18:56

标签: ios swift alamofire

我使用此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

我做错了什么?

这是我得到的错误:

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

  

我做错了什么?

两件事。首先,你在某处使用force-unwrap运算符,可能在这里:

NSUserDefaults.standardUserDefaults().stringForKey("BasicAuthenticationString")!

这意味着您确保返回值不是nil,但在这种情况下,确实如此。{p>}由于你违背了承诺,应用程序崩溃了。

其次, 请不要存储NSUSERDEFAUL中的授权字符 。 iOS有一个高度安全的钥匙串是有原因的。 NSUserDefaults不提供加密。请使用钥匙串。有一些包装库,如LocksmithSSKeychain,可以为您提供帮助。

答案 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