FirebaseStorage将数据下载到内存中的问题(Swift)



由于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! 
}

然后您可以在日志中看到下载是否已开始。

相关内容

  • 没有找到相关文章

最新更新