2017-07-02 36 views
0

標題說明了所有內容。我只是無法從Firebase存儲目錄下載圖像。下面是代碼,它調用的功能設置數據的片段,然後還要求它試圖下載圖片的功能:在Swift中下載圖片時,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文檔,但仍然無法理解這一點。

謝謝!

回答

1

從遠程服務器下載圖像是一個異步任務,這意味着結果不可立即使用。這就是gsReference.downloadURL接受完成回調作爲參數的原因,並且沒有返回值。由於你的函數(downloadImageProductFromFirebase)僅僅是gsReference.downloadURL的包裝,所以它也應該接受一個完成回調作爲參數,並且不應該有一個返回值(即除去-> UIImage?)。

當您撥打self.downloadImageProductFromFirebase傳遞一個收到圖像的閉包時,找到productList中相應產品的索引,並將其自身設置爲單元格的圖像(假設您正在單元格中顯示圖像)。

請參閱this answer瞭解如何異步設置細胞圖像。