从Firebase检索图像到UIimage swift5

从Firebase检索图像到UIimage swift5,swift,firebase,uiimage,firebase-storage,Swift,Firebase,Uiimage,Firebase Storage,我正在努力将图片从firebase存储下载到swift 5中的UIImage 我可以很好地上传它们。当我试图检索图片时,UIImage显示一个黑屏 这里是返回UIImage的函数 import UIKit import Firebase func getImageEvent (imagePath : String) -> UIImage? { var myImage : UIImageView? //Access to the storage let sto

我正在努力将图片从firebase存储下载到swift 5中的UIImage

我可以很好地上传它们。当我试图检索图片时,UIImage显示一个黑屏

这里是返回UIImage的函数

import UIKit

import Firebase

func getImageEvent (imagePath : String) -> UIImage? {

    var myImage : UIImageView?

    //Access to the storage
    let storageRef =  Storage.storage().reference(withPath: imagePath)

    storageRef.getData(maxSize: 1 * 1024 * 1024) {(data, error) in

        if let error = error {
            print(error.localizedDescription)
            return
        }

        if let data = data {

            print(data.description)

            myImage?.image = UIImage(data: data)

        }
    }

    return myImage?.image
}

//Call the function

getImageEvent (imagePath :"9U4BoXgBgTTgbbJCz0zy/eventMainImage.jpg")

在控制台中,我可以很好地看到printdata.description的值

默认情况下,UIImageView中有一个图像。调用该函数时,默认图像将替换为黑屏

你能帮我理解这个错误吗


非常感谢

有很多方法可以做到这一点,但首先简要介绍一下问题:

闭包中的return语句将在图像下载之前执行-Firebase函数是异步的,代码必须以允许从internet下载和获取数据的方式编写。所以-不要尝试从异步函数返回数据

下面是使用完成处理程序重新编写的代码。只有在映像完全下载后,才会调用该处理程序

func getImageEvent (imagePath: String, completion: @escaping(UIImage) -> Void) {
    var myImage : UIImageView?
    let storageRef =  Storage.storage().reference(withPath: imagePath)
    storageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
        if let error = error {
            print(error.localizedDescription)
            return
        }

        if let data = data {
            if let myImage = UIImage(data: data) {
                completion(myImage)
            }
        }
    }
}
关键是如何调用这个函数。注意:此代码等待UIImage数据在其闭包内传回,并让您知道获取映像已完成

self.getImageEvent(imagePath: "9U4BoXgBgTTgbbJCz0zy/eventMainImage.jpg", completion: { theImage in
    print("got the image!")
})

如果映像未下载或myImage为零,则应添加额外的错误检查。将错误消息与nil myImage一起传回将是一种选择,或者将对象作为可选对象传回,然后在self.downloadImageAtPath中检查nil将是另一种选择。

要完成解决方案,请参见用于在tableView中获取特定单元格中图片的代码

 getImageEvent(imagePath: myArray[indexPath.row].partyImagePath) { (image) in

         cell.partyImage.image = image

        }

通过快速扫描,似乎myImage?.image=UIImagedata:返回myImage?时数据尚未运行。image执行。通过在调试器中运行代码,或者放置一些print语句来查看流,您应该能够轻松地验证这一点。如果这是原因,你可以通过传递一个闭包来轻松修复它,就像在这个答案中所做的那样:代码比互联网快,并且从异步函数返回值通常不起作用。哦,太棒了!你救了我一个不眠之夜!它工作得很好。大的thanks@AlphadjoSako杰出的很高兴我能帮忙。如果这个答案对你有帮助,请确保它能帮助别人。