由于Firebase的重大更新,我将我的应用程序的图像托管从AWS切换到Firebase中现在包含的GS存储。我已经导入了所有必要的pod,这个应用程序已经成功地将图像上传到指定的存储桶中,但问题是当我想将存储的图像下载到内存中时,应用程序正在崩溃,调试时我在我的FIRStorageReference对象中发现了以下错误:"使用未声明的类型‘FirebaseStorage’"我正在将Firebase标头导入函数所在的VC中。
func getImage(imageName: String) -> UIImage {
let imageRef = kBucketRef.child(imageName)
print(imageRef)
var imageData: NSData?
var image: UIImage?
imageRef.dataWithMaxSize(200 * 1024) { (data, error) -> Void in
if (error != nil) {
imageData = data
image = UIImage(data: imageData!)
} else {
print(error?.localizedDescription)
}
}
return image!
}
稍后,当尝试在:image.image=getImage(imageName)中显示图像时,它会在返回图像中抛出上述错误!
致命错误:在展开可选值时意外发现nil
正在打印imageRef的描述:表达式产生错误:/var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11。swift:1:46:错误:使用未声明的类型"FirebaseStorage"$__lldb__DumpForDebugger(Swift.UnsafePointer<FirebaseStorage.FIRStorageReference>(位模式:0x11d028fa0).内存)^~~~~ ~~~~~~/var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11.swift:1:45:注意:分析此"<"时作为类型参数括号$__lldb__DumpForDebugger(Swift.UnsafePointer(位模式:0x11d028fa0).内存)
"print(imageRef)"的输出打印GS引用(GS://project-xxxxxxx…),但".dataWithMaxSize()"无法通过
提前感谢
(几天后)好的,这里有一个解决方法,因为FIRStorage方法不会在一个单独的函数中修改vars以便稍后返回:
let bucket: String = "gs://mystoragetesterxxxxxx.appspot.com"
func getImage() {
let storage = FIRStorage.storage()
let storageRef = storage.referenceForURL(bucket)
let path = storageRef.child("photo.jpg")
print(path)
path.dataWithMaxSize(1024 * 1024) { (data, error) in
if (error != nil) {
print(error!.localizedDescription)
} else {
self.imageView.image = UIImage(data: data!)
}
}
}
现在getImage是一个void函数,但它可以
您确定这不仅仅是您声明可选类型的问题吗:
var image: UIImage?
然后调用异步函数
imageRef.dataWithMaxSize...
然后在不等待的情况下,返回一个隐式展开的可选项?
return image!
在我看来,既然图像为零,你就"出乎意料地打开了一个零",这在很大程度上取决于种族条件才能成功。
我会尝试更像的东西
var image: UIImage?
imageRef.dataWithMaxSize(200 * 1024) { (data, error) -> Void in
if (error != nil) {
return UIImage(data: data!)!
} else {
print(error?.localizedDescription)
}
}
不过,一般来说,封装异步调用并尝试使其同步是个坏主意(除非您实现了类似promise的东西)——您应该只使用异步调用来更新主线程上的UI元素。
试试这样的
let storage = FIRStorage.storage()
则函数
func getImage(imageName: String) -> UIImage {
let gsReference = storage.referenceForURL(imageName!)
print(imageRef)
var imageData: NSData?
var image: UIImage?
let downloadTask = gsReference.dataWithMaxSize(200 * 1024) { (data, error) -> Void in
if (error != nil) {
//imageData = data
//image = UIImage(data: imageData!)
let image = UIImage.init(data: data!)
} else {
print(error?.localizedDescription)
}
downloadTask.observeStatus(.Resume) { (snapshot) -> Void in
print("Downloading has started")
}
}
return image!
}
然后您可以在日志中看到下载是否已开始。