在下载图像时检查Nil后变量显示为零

时间:2018-05-08 13:10:31

标签: ios swift uitableview firebase firebase-storage

在我解释这个时,请耐心等待,

我正在建立一个聊天室,用户可以在其中上传照片以供其他人查看。当用户点击图标时,他们可以将照片上传到我的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

3 个答案:

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

您正尝试从未完全检索的数据转换图像,因此请使用下面的库,这将为您提供更好的结果,以便通过网址异步检索。

Kingfisher

答案 2 :(得分:0)

在调查问题后,我发现了问题。当我创建我的通知单元格(使用xib文件)时,我将uiimageview链接到单元格的视图控制器。但是,某种程度上图像视图与单元格无关。因此,当程序将图像上传到图像视图时,它为图像视图找到了nil而不是为图像本身找到nil(即图像视图显然不存在)。这是一个如此愚蠢的问题。谢谢你帮我调查一下。欢呼声。