gpt4 book ai didi

ios - FirebaseStorage 将数据下载到内存中时出现问题(Swift)

转载 作者:行者123 更新时间:2023-11-28 12:48:02 26 4
gpt4 key购买 nike

感谢 Firebase 的重大更新,我将我的应用程序的图像托管从 AWS 切换到 Firebase 中现在包含的 GS Storage。我已经导入了所有必要的 pod,这个应用程序已经成功地将图像上传到指定的存储桶,但问题是当我想下载到存储的内存图像时,应用程序崩溃了,调试我在我的 FIRStorageReference 对象中发现了以下错误:“使用未声明的类型‘FirebaseStorage’”我正在将 Firebase header 导入函数所在的 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) 它会在返回图像中抛出上述错误!

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)

“print(imageRef)”的输出打印了 GS 引用 (gs://project-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...

然后不等待它,返回一个隐式解包的可选?

返回图片!

在我看来,因为 image 是 nil,所以你“意外地展开了一个 nil”,这在很大程度上依赖于竞争条件来取得成功。

我会尝试更像:

var image: UIImage? 
imageRef.dataWithMaxSize(200 * 1024) { (data, error) -> Void in
if (error != nil) {
return UIImage(data: data!)!
} else {
print(error?.localizedDescription)
}
}

但总的来说,封装一个异步调用并尝试使其同步不是一个好主意(除非您实现类似 promises 的东西)——您应该只使用异步调用然后在主线程上更新 UI 元素。

关于ios - FirebaseStorage 将数据下载到内存中时出现问题(Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37425125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com