SDWebImage给出nil的URL

时间:2017-10-17 05:49:13

标签: ios swift3 sdwebimage

我有一个字符串,其中我用逗号分隔图像链接。以下是我将其拆分为数组的方式:let imagesLinks = imageLins.components(separatedBy: ",")。然后我用循环来获取一个链接,下载图像并以这种方式将其存储在UIImage数组中:

for imag in imagesLinks
        {
            let img = UIImageView()

            print("\(baseReportImageURL)\(imag)")

            img.sd_setImage(with: URL(string: "\(baseReportImageURL)\(imag)"), placeholderImage: nil)
            imagesArray.append(img.image!)
        }

print语句给了我正确的URL,当我在浏览器上打开时,会下载图像。问题是在我附加数组的行,即imagesArray.append(img.image!)。我明白了:

  

致命错误:在解包可选值时意外发现nil

  

致命错误:在解包可选值时意外发现nil

那么这对于什么是正确的解决方案呢?

更新

我的问题不同,因为我正在使用SDWebImage,当我使用完成块时,应用程序有一种奇怪的行为:

img.sd_setImage(with: imgURL, placeholderImage: nil,options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
                activityIndicator.stopAnimating()
                imagesArray.append(image!)
                self.photoCollection.reloadData()
            })

因此它继续旋转活动指示器,当我返回并再次推动视图时,它会立即加载图像。所以我认为在下载图像时不会调用完成块,但为什么会这样?

4 个答案:

答案 0 :(得分:1)

我认为这不是获取下载图像的正确方法(将图像设置为UIImageView,然后从那里获取图像)。

您应该使用SDWebImage提供的图像下载器:

SDWebImageManager.shared().imageDownloader?.downloadImage(with: <YOUR_URL>, options: [], progress: { (received, expected, nil) in
            print(received,expected)
        }, completed: { (image, data, error, true) in
            yourArray.append(image)
        })

如果有索引,则每次下载图像时都可以更新tableview中的当前行,也可以只更新整个reload(),但我建议您先更新一次。

答案 1 :(得分:0)

这是因为

  imagesArray.append(img.image!)

图像需要一些时间才能下载。当您执行imagesArray.append(img.image!)时,您的图片可能未设置为您的图片视图,这意味着您正试图在nil中添加imageArray

第二件事为什么要将图像存储在数组中?您有urls数组,并且每次要显示图像使用SDWebImage时都使用SDWebImage。无需存储在数组中!

如果你想要数组中的图像,而不是使用NSUrlSession异步请求和完成处理程序,并从完成处理程序添加图像到你的数组!

答案 2 :(得分:0)

将图像附加到sd_setImage完成块中的images阵列中。 当您尝试将图像添加到数组中时,尚未下载图像,并在添加图像之前检查图像是否不等。

答案 3 :(得分:0)

使用此块进行图像下载下载后执行操作(附加图像)

cell.appIcon.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
 // Perform operation.
//append Image Here
})