ios - 在 Swift 中下载图片时,Firebase 引用为 'variable not available'

标签 ios swift firebase 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
}

但是,由于某种原因,它在调用最后一个函数时崩溃,提示“ fatal error :在展开可选值时意外发现 nil”。我尝试使用调试器,发现 Firebase 对存储变量的引用显示“变量不可用”。

你们中有人可以帮我解决这个问题吗?我想我已经阅读了 Firebase 文档大约一百遍,但仍然不明白这一点。

谢谢!

最佳答案

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

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

当你调用self.downloadImageProductFromFirebase时,传入一个接收图片的闭包,在productList中找到对应产品的索引,并将自己设置为单元格的图片(假设您在单元格中显示图像)。

参见 this answer了解如何异步设置单元格图像。

关于ios - 在 Swift 中下载图片时,Firebase 引用为 'variable not available',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44873622/

相关文章:

iphone - 使用 SpriteKit 驱动计算

iphone - CLLocationManager 在发布时崩溃,但为什么呢?

swift - 每当广告加载失败时显示 View 而不是广告

typescript - Firebase Cloud Functions - 缺少 FIREBASE_CONFIG 环境变量

javascript - 火存储 : Dynamically Update Document (web)

firebase - Firestore.getInstance() : how to use?

android - AVD : Is there an inspector?

iphone - 未调用 UIViewController 的 loadView

ios - Xcode 拒绝让我将 Swift 文件导入 Objective-C 文件 ('projectname-swift.h' 未找到)

macos - 使用 swift 关闭其他应用程序