将数据下载到内存中的FirebaseStorage问题(Swift)
感谢Firebase的重大更新,我将我的应用的图像托管从AWS切换到现在包含的Firebase中的GS存储。 我已经导入了所有必需的豆荚,这个应用程序已经成功上传图像到指定的桶,但问题是当我想下载到存储器中的图像存储,并且应用程序崩溃,调试我发现在我的FIRStorageReference中出现以下错误对象:“使用未声明的类型”FirebaseStorage“” 我正在将Firebase标题导入函数所在的VC。将数据下载到内存中的FirebaseStorage问题(Swift)
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)被调用它的回报图像抛出提到的错误!
fatal error: unexpectedly found nil while unwrapping an Optional value
Printing description of imageRef: expression produced error: /var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11.swift:1:46: error: use of undeclared type 'FirebaseStorage' $__lldb__DumpForDebugger(Swift.UnsafePointer< FirebaseStorage.FIRStorageReference >(bitPattern: 0x11d028fa0).memory) ^~~~~~~~~~~~~~~ /var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11.swift:1:45: note: while parsing this '<' as a type parameter bracket $__lldb__DumpForDebugger(Swift.UnsafePointer(bitPattern: 0x11d028fa0).memory)
从输出 '打印(imageRef)' 打印GS引用(GS://项目-XXXXXX ......),但 '.dataWithMaxSize()' 未能预先
谢谢
(天后) 好吧,这里是一个解决办法,因为FIRStorage方法不是在以后回报分离功能修改瓦尔:
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这是一个无效的功能,但它的工作原理
你确定这是不是只是你在哪里声明一个可选类型的问题:
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)
}
}
虽然在一般,包装一个异步调用,并试图使其同步是一个坏主意(除非你实现类似的承诺) - 你应该使用异步调用,然后在主线程上更新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!
}
然后你在日志中看到,如果下载已经开始。
在下载任务之前,我可以打印存储引用完整路径:gs://project-xxxxxx163293.appspot.com/images /xxxxxx.jpg,所以引用是好的 在dataWithMaxSize:完成我在if之前添加了一个print(“dataWithMaxSize running”)语句,然后下一个控制台输出是返回图像行中的“found nil”错误,我在想这个任务没有运行,当图像:UIImage?从返回中调用它是零,因此是错误。 –
根据你的建议改变了函数,它抛出nil,存储的文件路径是正确的,那里有一个文件,但它仍然没有分配给“数据”,存储桶被配置为公共。 它不会触发(error!= nil)条件,它只是不下载图像 –