在Swift中下载图片时,Firebase参考“变量不可用”

问题描述:

标题说明了所有内容。我只是无法从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文档,但仍然无法理解这一点。

谢谢!

从远程服务器下载图像是一个异步任务,这意味着结果不可立即使用。这就是gsReference.downloadURL接受完成回调作为参数的原因,并且没有返回值。由于你的函数(downloadImageProductFromFirebase)仅仅是gsReference.downloadURL的包装,所以它也应该接受一个完成回调作为参数,并且不应该有一个返回值(即除去-> UIImage?)。

当您拨打self.downloadImageProductFromFirebase传递一个收到图像的闭包时,找到productList中相应产品的索引,并将其自身设置为单元格的图像(假设您正在单元格中显示图像)。

请参阅this answer了解如何异步设置细胞图像。