存储对 URL 的引用

Posted

技术标签:

【中文标题】存储对 URL 的引用【英文标题】:StorageReference to URL 【发布时间】:2020-04-17 18:01:45 【问题描述】:

我正在尝试遵循 Firebase 的文档,了解如何在应用程序中向用户显示来自 firebase 存储的图像。这是下面的文档:

// Reference to an image file in Firebase Storage
let reference = storageRef.child("images/stars.jpg")

// UIImageView in your ViewController
let imageView: UIImageView = self.imageView

// Placeholder image
let placeholderImage = UIImage(named: "placeholder.jpg")

// Load the image using SDWebImage
imageView.sd_setImage(with: reference, placeholderImage: placeholderImage)

我自己尝试这样做:

//get image url from deal
self.ref.child("deals").child("log").child(currentDealView).child("pictures").child(currentImageView).child("imageSelected").child("imageSelected").observeSingleEvent(of: .value)  (snapshot) in
    let imageUrlString = snapshot.value as! String
    let imageUrlUrl = URL(string: imageUrlString)

    print(imageUrlString)
    //prints "deals/log/dealNumber83/pictures/googleScreenshot/imageSelected"

    // Reference to an image file in Firebase Storage
    let reference = self.storageRef.child(imageUrlString)

    // UIImageView in your ViewController
    let viewPicImageView: UIImageView = self.viewPicImageView

    // Placeholder image
    let placeholderImage = UIImage(named: "placeholder.jpg")

    // Load the image using SDWebImage

    viewPicImageView.sd_setImage(with: reference, placeholderImage: placeholderImage)

但在最后一行,我在“with:reference”处出现错误,说:“无法将 'StorageReference' 类型的值转换为预期的参数类型 'URL?'”我在网上找不到任何关于如何使用的信息将StorageReference 转换为URL?谢谢。

【问题讨论】:

【参考方案1】:

你可以用这个:

let Ref = Storage.storage().reference(forURL: imageUrlUrl)
Ref.getData(maxSize: 1 * 1024 * 1024)  data, error in
    if error != nil 
        print("Error: Image could not download!")
     else 
        yourImageView.image = UIImage(data: data!)
    

希望对你有帮助...

【讨论】:

如果我使用forURL: imageUrlUrl,我会收到错误消息“无法转换'URL 类型的值?'到预期的参数类型“字符串””。如果我将其更改为 forURL: imageUrlString,则应用程序崩溃并出现错误“线程 1:异常:”URL 方案必须是 gs://、http:// 或 https:// 之一“” 当您在存储中点击下载图像时,它会为您提供一个 url。将此写入您的代码。 我使用您的代码让它工作(谢谢),我意识到我的问题是 imageURLString 是“deals/x/x/pic”,我将该字符串更改为“gs://myap- gd36f.appspot.com/deals/x/x/pic" 而是修复了它。【参考方案2】:

或者,FirebaseStorageSwift 测试版利用 Swift Result 类型。 (将pod 'FirebaseStorageSwift' 添加到 Podfile。)

let Ref = Storage.storage().reference(forURL: imageUrlUrl)
Ref.getData(maxSize: 1 * 1024 * 1024)  result in
  switch result 
  case let .success(data):
    yourImageView.image = UIImage(data: data)
  case let .failure(error):
    print("Error: Image could not download! \(error)")
  

【讨论】:

以上是关于存储对 URL 的引用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CloudKit 中存储对共享记录的引用

Dart 变量存储对值的引用

为啥要存储对 int (而不是值)的“引用”? [复制]

如何将存储在引用表中的引用值插入到另一个表中?

存储对相机胶卷图像的引用 - Swift 4

为啥对 Python 值的引用(即函数参数)存储在 CPython 的堆栈(帧)中?