2016-05-24 5 views
0

Firebaseのメジャーアップデートのおかげで、私のアプリのイメージホスティングをAWSからFirebaseのGSストレージに切り替える予定です。 私はすでに必要なすべてのポッドをインポートしました。このアプリは既に割り当てられたバケットに画像をアップロードできますが、問題は保存されたメモリイメージにダウンロードしたいときです。また、アプリがクラッシュしています。オブジェクト: "宣言されていないタイプの使用 '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の)それは、戻り画像で述べたエラーがスローされますと呼ばれています!しかし '.dataWithMaxSize()' 事前

感謝を失敗:

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のリファレンス(//プロジェクト-XXXXXX ... GS)を出力します

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

} 

(日後) が[OK]を、ここでFIRStorage方法は、後で復帰するための分離機能にVARSを修正されていないので、この問題を回避するには、あります3210

は、今ではvoid関数だのgetImageが、それは

答えて

1

が、これはオプションのタイプを宣言しているだけの問題ではないよろしいです動作します。そして、非同期関数を呼び出す

var image: UIImage?

は、暗黙的に開封されたオプションを返し、それを待たずに

imageRef.dataWithMaxSize...

してから?

return 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) 
    } 
} 

は悪い考えです - あなただけのはず非同期呼び出しを使用して、メインスレッド上の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

ダウンロードタスクの前に、Storageリファレンスフルパスを印刷できます:gs://project-xxxxxx163293.appspot.com/images /xxxxxx.jpgなので、参照はOKです dataWithMaxSizeで完了しましたifの前にprint( "dataWithMaxSize running")ステートメントを追加してから、次のコンソール出力が戻り画像行に "found nil"エラーとなりました、私はタスクが実行されていないと思っているときと画像:UIImage?それを返すことから呼び出されます。 –

関連する問題