感谢Firebase的重大更新,我正在将我的应用程序的图片托管从AWS切换到现在包含在Firebase中的GS Storage。 我已经导入了所有必需的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>(bitPattern: 0x11d028fa0)。记忆体) ^ ~~~~~~~~~~~~~~ /var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11.swift:1:45: 注意:解析这个'<'时作为类型参数括号 $ __ lldb__DumpForDebugger(Swift.UnsafePointer(位模式: 0x11d028fa0)。记忆体)
'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它是一个void函数,但它可以正常工作
答案 0 :(得分:1)
您确定这不仅仅是您声明可选类型的问题:
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)
}
}
对我而言似乎是因为图像是零,你“出乎意料地打开一个零”,这非常依赖于竞争条件才能成功。
我会尝试更多的东西:
{{1}}
一般情况下,包装异步调用并尝试使其同步是个坏主意(除非你实现类似promises) - 你应该只使用异步调用然后在主线程上更新UI元素。
答案 1 :(得分:1)
尝试这样的事情
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!
}
然后你会在日志中看到下载是否已经开始。