2017-07-02 3 views
0

タイトルはすべてを言います。 Firebase Storageディレクトリからイメージをダウンロードできません。ここでは、データを設定するための関数を呼び出すと、それはまた、画像をダウンロードしようとする関数を呼び出すコードのスニペットは次のとおりです。スウィフトで画像をダウンロードするとき、Firebaseのリファレンスが「変数が利用できません」

for element in Dict { 
      if let itemDict = element.value as? [String:AnyObject]{ 
       let name = itemDict["name"] as! String 
       let price = itemDict["price"] as! Float 
       let imageObject = itemDict["image"] as! NSDictionary 
       let hash = imageObject["hash"] as! String 
       let storageDir = imageObject["storageDir"] as! String 
       let image:UIImage = self.downloadImageProductFromFirebase(append: hash)! 
       let product = Product(name: name, image: image, imageName:hash, price: price, storageDir : storageDir) 
       self.productList.append(product) 
      } 
     } 
     print(Dict) 
     self.myTable.reloadData() 

そしてここでは、画像をダウンロードしようとするコードは次のとおりです。

func downloadImageProductFromFirebase(append:String) -> UIImage?{ 
    let gsReference = Storage.storage().reference(forURL: "gs://fridgeapp-3e2c6.appspot.com/productImages/productImages/" + append) 
    var image : UIImage? 

    gsReference.downloadURL(completion: { (url, error) in 
     if error != nil { 
      print(error.debugDescription) 
      return 
     } 
     URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in 

      if error != nil { 
       print(error.debugDescription) 
       return 
      } 
      guard let imageData = UIImage(data: data!) else { return } 

      DispatchQueue.main.async { 
       image = imageData 
      } 

     }).resume() 
    }) 
    return image 
} 

しかし、何らかの理由で、この最後の関数を呼び出したときにちょうどクラッシュし、 "致命的なエラー:予期せぬことにオプション値をアンラッピングしている間に見つかりませんでした"と言います。私はデバッガを使用しようとしましたが、FirebaseのStorage変数への参照で「変数が利用できません」というメッセージが表示されました。

あなたの誰かが私にこれを手伝ってもらえますか?私はFirebaseの文書を約100回読みましたが、それでもポイントを得ることはできません。

ありがとうございました!

答えて

1

リモートサーバーからイメージをダウンロードすることは非同期タスクです。つまり、結果がすぐに利用できないことを意味します。これは、gsReference.downloadURLが完了コールバックを引数として受け入れ、戻り値を持たない理由です。あなたの関数ので

downloadImageProductFromFirebase)は、単にgsReference.downloadURLにラッパーである、それはまた、引数として完了コールバックを受け入れる必要があり、および戻り値を持つべきではない(すなわち-> UIImage?を除去します)。

画像を受け取るクロージャー内でself.downloadImageProductFromFirebaseと呼ぶと、対応する製品のインデックスがproductListにあり、自分自身をセルの画像として設定します(セルに画像を表示していると仮定します)。

セルイメージを非同期に設定する方法については、this answerを参照してください。

関連する問題