在这样的函数中,我得到一个零值,但我不明白为什么。中间的代码返回一个图像(我确定这一点,我也检查了一些打印语句(。我不知道它怎么可能总是返回 nil。这就像它忽略了中间运行的所有代码,只考虑第一个和最后一个语句。
func getImagesDownloaded(reference: StorageReference) -> UIImage {
var imagePassedIn : UIImage?
reference.getData(maxSize: 10*1024*1024) { (data, error) in
guard let imageObject = UIImage(data: data!) else {print("Error has occurred: (String(describing: error?.localizedDescription))"); return}
imagePassedIn = imageObject
}
if imagePassedIn == nil {
print("Error, getImagesDownloaded is not working")
}
return imagePassedIn!
}
问题是StorageReference.getData
是一个异步函数,但您正在尝试同步返回一个值。需要使用完成处理程序返回异步检索的值。
func getImagesDownloaded(reference: StorageReference, completion: (UIImage?,Error?)->()) {
reference.getData(maxSize: 10*1024*1024) { (data, error) in
guard error == nil, let data = data else {
completion(nil,error)
return
}
guard let image = UIImage(data: data) else {
completion(nil, FirebaseErrors.expectedImage)
return
}
completion(image,nil)
}
}
enum FirebaseErrors: Error {
case expectedImage
}
然后你需要像这样使用它:
getImagesDownloaded(reference: yourStorageReference, completion: { image, error in
guard let image = image, error == nil else {
print(error)
return
}
// Assign your image to a UIImageView or do anything else with it inside the closure (before the ending `}`)
yourImageView.image = image
})
您正在使用闭包,并且在执行 nil 检查时可能不会返回 imageObject。Swift 是逐行执行的,当你有异步代码时,它会执行下一行,而不是等待结果。
您应该在闭包中移动图像通过检查。
您正在完成块中设置imagePassedIn
。这意味着当您准备好设置它时,您已经重新调整了它。
简而言之,当使用完成块时,下面的代码不会等待它完成才能执行。
将您的函数更新为:
func getImagesDownloaded(reference: StorageReference, _ completion: (UIImage) -> ()) {
reference.getData(maxSize: 10*1024*1024) { (data, error) in
guard let data = data, let imageObject = UIImage(data: data) else {print("Error has occurred: (String(describing: error?.localizedDescription))"); return}
completion(imageObject)
} else {
print("Error, getImagesDownloaded is not working")
}
}