繁体   English   中英

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

[英]Firebase reference is 'variable not available' when downloading picture in 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
}

但是,由于某种原因,它仅在调用此最后一个函数时崩溃,并说“致命错误:在解开Optional值时意外发现nil”。 我尝试使用调试器,但发现Firebase对存储变量的引用显示“变量不可用”。

你们中有人可以帮助我吗? 我认为我阅读了Firebase文档大约一百次,但仍然不明白这一点。

谢谢!

从远程服务器下载映像是异步任务,这意味着结果无法立即获得。 这就是gsReference.downloadURL接受完成回调作为参数并且没有返回值的原因。

由于您的函数( downloadImageProductFromFirebase )只是gsReference.downloadURL的包装,因此它还应该接受完成回调作为参数,并且不应具有返回值(即,删除-> UIImage? )。

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

请参阅此答案以了解如何异步设置单元格图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM