使用 AlamoFireImage 在 CollectionView 中使用 .af_setImage 方法加载数组 url 的致命错误

Posted

技术标签:

【中文标题】使用 AlamoFireImage 在 CollectionView 中使用 .af_setImage 方法加载数组 url 的致命错误【英文标题】:Fatal error using AlamoFireImage to load a url of Arrays using the .af_setImage method in a CollectionView 【发布时间】:2016-12-01 05:51:27 【问题描述】:

我从我的 REST API 获得了一个 url 数组,我想使用它们从服务器加载图像,使用 AlamofireImage .af_setImage 方法为我的集合视图单元格。但我在调试控制台中收到以下错误消息:

fatal error: unexpectedly found nil while unwrapping an Optional value

这是我正在使用的代码:

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CollectionViewCellIdentifiers.searchResultCell, for: indexPath) as! CreaTuCanastaCollectionViewCell

        let urlString = productPictures[indexPath.item]

        if let url = URL(string: productPictures[indexPath.item]) 
            cell.imageView.af_setImage(withURL: url)
        

     return cell
   

奇怪的是调试控制台抛出这个:

这意味着价值观就在那里,但它不断地向我抛出 致命错误:

unexpectedly found nil while unwrapping an Optional value

有什么想法吗?

编辑

我尝试使用 SDImage 代替 AlamoFireImage

 if let url = URL(string: productPictures[indexPath.item]) 

            cell.imageView.sd_setImage(with: url)
        

我得到相同的结果

编辑

这次我尝试了一种不同的方法,我将这段代码放在了 cellForItemAt 方法中:

Alamofire.request(urlArray).responseImage  response in
            debugPrint(response)

            print(response.request)
            print(response.response)
            print(response.result)

            if let image = response.result.value 

                    cell.imageView.image = image
            

这在调试控制台中给了我这个响应:

SUCCESS
<UIImage: 0x620000283fc0>, 300, 300
[Response]: <NSHTTPURLResponse: 0x62800002cb80>  URL: https://i1.wp.com/pixan.wpengine.com/wp-content/uploads/2016/07/canasta-pareja.jpg?fit=600%2C600&ssl=1   status code: 200, headers 
"Cache-Control" = "public, max-age=63115200";
"Content-Length" = 24757;
"Content-Type" = "image/jpeg";
Date = "Thu, 01 Dec 2016 06:06:41 GMT";
Etag = "\"629f656831de2958\"";
Expires = "Sat, 01 Dec 2018 18:00:39 GMT";
"Last-Modified" = "Thu, 01 Dec 2016 06:00:39 GMT";
Link = "<https://pixan.wpengine.com/wp-content/uploads/2016/07/canasta-pareja.jpg>; rel=\"canonical\"";
Server = nginx;
Vary = Accept;
"x-bytes-saved" = 2467;
"x-content-type-options" = nosniff;
"x-nc" = "HIT bur 66";
 
[Data]: 24757 bytes
[Result]: SUCCESS: <UIImage: 0x6280002830c0>, 300, 300
[Timeline]: Timeline:  "Request Start Time": 502265200.175, "Initial     Response Time": 502265200.756, "Request Completed Time": 502265200.813, "Serialization Completed Time": 502265200.821, "Latency": 0.581 secs, "Request Duration": 0.638 secs, "Serialization Duration": 0.008 secs, "Total Duration": 0.645 secs 
Optional(https://i1.wp.com/pixan.wpengine.com/wp-content/uploads/2016/07/canasta-pareja.jpg?fit=600%2C600&ssl=1)
Optional(<NSHTTPURLResponse: 0x62800002cb80>  URL: https://i1.wp.com/pixan.wpengine.com/wp-content/uploads/2016/07/canasta-pareja.jpg?fit=600%2C600&ssl=1   status code: 200, headers 
"Cache-Control" = "public, max-age=63115200";
"Content-Length" = 24757;
"Content-Type" = "image/jpeg";
Date = "Thu, 01 Dec 2016 06:06:41 GMT";
Etag = "\"629f656831de2958\"";
Expires = "Sat, 01 Dec 2018 18:00:39 GMT";
"Last-Modified" = "Thu, 01 Dec 2016 06:00:39 GMT";
Link = "<https://pixan.wpengine.com/wp-content/uploads/2016/07/canasta-pareja.jpg>; rel=\"canonical\"";
Server = nginx;
Vary = Accept;
"x-bytes-saved" = 2467;
"x-content-type-options" = nosniff;
"x-nc" = "HIT bur 66";
 )
SUCCESS
<UIImage: 0x6280002830c0>, 300, 300
2016-12-01 00:06:41.110589 pixan[9961:2940658] [] 

但我还是犯了同样的错误。

【问题讨论】:

您应该检查cell 对象是否为零。因为您使用的是dequeueReusableCell 函数,但是如果没有创建单元格以供重用,那么它将返回 nil。 【参考方案1】:
var urlstr = ""   
if let urlString = productPictures[indexPath.item] as? String

 urlstr = urlString

cell.imageView.sd_setImageWithURL(NSURL(string: urlstr!), placeholderImage: UIImage(named: "imgPlaceHolder"), completed:  (image, error, cacheType, imageURL) -> Void in)

【讨论】:

试过你的解决方案兄弟,但得到相同的回复。致命错误:在展开可选值时意外发现 nil 无论如何谢谢! view.sd_setImageWithURL(NSURL(string:"i1.wp.com/pixan.wpengine.com/wp-content/uploads/2016/07/…), placeholderImage: UIImage(named: "imgPlaceHolder"), completed: (image, error, cacheType, imageURL) -> Void in当我使用您的静态网址重试时,它的工作原理.. postimg.org/image/yk81a62wx 请在设置 "sd_setImageWithURL" 之前打印每个带有索引号的 UrlString 和 NSURL。所以,它会让你清楚在数组索引处哪个是 nil 这是一个很好的线索!没想到会试试,谢谢! 在设置为 "sd_setImageWithURL" 之前还有一件事对 url 进行编码,这也是 nil 的一个原因。 var stringUrl = "https://..." let URL = NSURL(string: stringUrl.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)!

以上是关于使用 AlamoFireImage 在 CollectionView 中使用 .af_setImage 方法加载数组 url 的致命错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 AlamofireImage 将 GIF 图像转换为 UIImageView

使用 AlamofireImage 设置占位符图像的 contentMode

AlamofireImage:如何使用 POST 请求下载图像

使用 Alamofireimage 从服务器获取图像后,Imageview 未更新

AlamofireImage : 每次应用启动后缓存为空

当 url 不是图像时,使用 AlamoFireImage 未捕获的 NSException 类型异常