2016-05-24 18 views
0

感谢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这是一个无效的功能,但它的工作原理

回答

1

你确定这是不是只是你在哪里声明一个可选类型的问题:

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元素。

+0

根据你的建议改变了函数,它抛出nil,存储的文件路径是正确的,那里有一个文件,但它仍然没有分配给“数据”,存储桶被配置为公共。 它不会触发(error!= nil)条件,它只是不下载图像 –

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

然后你在日志中看到,如果下载已经开始。

+0

在下载任务之前,我可以打印存储引用完整路径:gs://project-xxxxxx163293.appspot.com/images /xxxxxx.jpg,所以引用是好的 在dataWithMaxSize:完成我在if之前添加了一个print(“dataWithMaxSize running”)语句,然后下一个控制台输出是返回图像行中的“found nil”错误,我在想这个任务没有运行,当图像:UIImage?从返回中调用它是零,因此是错误。 –