我有一个字符串,其中我用逗号分隔图像链接。以下是我将其拆分为数组的方式: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()
})
因此它继续旋转活动指示器,当我返回并再次推动视图时,它会立即加载图像。所以我认为在下载图像时不会调用完成块,但为什么会这样?
答案 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
})