FirebaseStorage将数据下载到内存(Swift)

时间:2016-05-24 22:45:42

标签: ios swift firebase firebase-storage

感谢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函数,但它可以正常工作

2 个答案:

答案 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! 
}

然后你会在日志中看到下载是否已经开始。