在我解释这个时,请耐心等待,
我正在建立一个聊天室,用户可以在其中上传照片以供其他人查看。当用户点击图标时,他们可以将照片上传到我的Firebase数据库(这已成功发生,我已经对此进行了测试)。照片的URL被传递到消息数据库并加载到我创建的表视图中(我知道照片URL是因为打印语句和检查数据库)。然而,当我从URL下载照片时,应用程序崩溃说在打开我的可选(imageData)时它发现nil - 这是在if语句中,我只应该在检查imageData不是nil之后执行。我在此if语句之前也有一个print语句,它确认数据不是nil。为什么在打开数据时发现无效?在此先感谢您的帮助。
let notificationCell = tableView.dequeueReusableCell(withIdentifier: "messageImageCell", for: indexPath) as! MessageCellForPhotos
notificationCell.clipsToBounds = true
let newPhotoURL = NSURL(string: messagesArray[indexPath.row].userSentImage)! as URL
print("\(newPhotoURL) Hello World This Time")
DispatchQueue.global().async {
let imageData = try? Data(contentsOf: newPhotoURL) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
DispatchQueue.main.async {
print(imageData)
if imageData != nil {
notificationCell.sentImageView.image = UIImage(data: imageData!)
}
}
}
return notificationCell
答案 0 :(得分:0)
不要强行包装你的代码不要使用!它导致很多崩溃
使用if let or guard
所以newPhotoURL
guard let newPhotoURL = NSURL(string: messagesArray[indexPath.row].userSentImage) as? URL else {return}
和imageData
if let imageData = try? Data(contentsOf: newPhotoURL) , let image = UIImage(data: imageData) {
notificationCell.sentImageView.image = image
}
答案 1 :(得分:0)
您正尝试从未完全检索的数据转换图像,因此请使用下面的库,这将为您提供更好的结果,以便通过网址异步检索。
答案 2 :(得分:0)
在调查问题后,我发现了问题。当我创建我的通知单元格(使用xib文件)时,我将uiimageview链接到单元格的视图控制器。但是,某种程度上图像视图与单元格无关。因此,当程序将图像上传到图像视图时,它为图像视图找到了nil而不是为图像本身找到nil(即图像视图显然不存在)。这是一个如此愚蠢的问题。谢谢你帮我调查一下。欢呼声。