从Firebase检索图像到UIimage swift5
我正在努力将图片从firebase存储下载到swift 5中的UIImage 我可以很好地上传它们。当我试图检索图片时,UIImage显示一个黑屏 这里是返回UIImage的函数从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
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杰出的很高兴我能帮忙。如果这个答案对你有帮助,请确保它能帮助别人。