标题说明了一切。我只是无法从Firebase Storage目录下载图像。下面是调用函数来设置数据的代码片段,它还调用了试图下载图片的函数:
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
}
但是,出于某种原因,它只是在调用最后一个函数时崩溃,说“致命错误:在展开Optional值时意外地发现了nil”。我试图使用调试器,我发现Firebase对存储变量的引用说“变量不可用”。
你们中的某些人可以帮助我吗?我想我已经阅读了FirePad文档大约一百次,但仍然无法理解。
谢谢!
答案 0 :(得分:1)
从远程服务器下载映像是一项异步任务,这意味着结果不会立即可用。这就是gsReference.downloadURL
接受完成回调作为参数并且没有返回值的原因。
由于你的函数(downloadImageProductFromFirebase
)只是gsReference.downloadURL
的包装器,它也应该接受一个完成回调作为参数,并且不应该有一个返回值(即删除-> UIImage?
})。
当您在接收图片的闭包中调用self.downloadImageProductFromFirebase
时,在productList
中找到相应产品的索引,并将自己设置为单元格的图像(假设您&#39 ;重新显示单元格中的图像)。
有关如何异步设置单元格图像,请参阅this answer。