【问题标题】:Retrieve an image from Firebase to an UIimage swift5将图像从 Firebase 检索到 UIimage swift5
【发布时间】:2020-02-13 08:54:00
【问题描述】:

我正在努力将图片从 firebase 存储下载到 swift 5 中的 UIImage。

我可以很好地上传它们。当我试图检索图片时,UIImage 显示黑屏。

这是我返回 UIImage 的函数

import UIKit

import Firebase

func getImageEvent (imagePath : String) -> UIImage? {

    var myImage : UIImageView?

    //Access to the storage
    let storageRef =  Storage.storage().reference(withPath: imagePath)

    storageRef.getData(maxSize: 1 * 1024 * 1024) {(data, error) in

        if let error = error {
            print(error.localizedDescription)
            return
        }

        if let data = data {

            print(data.description)

            myImage?.image = UIImage(data: data)

        }
    }

    return myImage?.image
}

//Call the function

getImageEvent (imagePath :"9U4BoXgBgTTgbbJCz0zy/eventMainImage.jpg")

在控制台中,我可以很好地看到 print(data.description) 的值。

默认情况下,UIImageView 中有一个图像。调用该函数时,默认图像被替换为黑屏。

你能帮我理解错误吗?

非常感谢

【问题讨论】:

  • 从快速扫描看来,myImage?.image = UIImage(data: data) 在return myImage?.image 执行时还没有运行。您应该能够通过在调试器中运行代码或放置一些打印语句来查看流程来轻松验证这一点。如果这是原因,您可以通过传入闭包轻松修复它,类似于在此答案中的完成方式:stackoverflow.com/a/52406759
  • 代码比互联网快,从异步函数返回值通常不起作用。

标签: swift firebase uiimage firebase-storage


【解决方案1】:

有很多方法可以解决这个问题,但首先简要描述一下问题:

闭包中的 return 语句将在下载该图像之前执行 - Firebase 函数是异步的,并且必须以允许有时间从 Internet 下载和获取数据的方式编写代码。所以 - 不要尝试从异步函数返回数据。

这是使用完成处理程序重写的代码。只有在图像完全下载后才会调用该处理程序。

func getImageEvent (imagePath: String, completion: @escaping(UIImage) -> Void) {
    var myImage : UIImageView?
    let storageRef =  Storage.storage().reference(withPath: imagePath)
    storageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
        if let error = error {
            print(error.localizedDescription)
            return
        }

        if let data = data {
            if let myImage = UIImage(data: data) {
                completion(myImage)
            }
        }
    }
}

关键是如何调用该函数。请注意,此代码等待数据(UIImage)在其闭包内传回给它,并让您知道获取图像已完成。

self.getImageEvent(imagePath: "9U4BoXgBgTTgbbJCz0zy/eventMainImage.jpg", completion: { theImage in
    print("got the image!")
})

您应该添加额外的错误检查,以防图像未下载或 myImage 为 nil。将错误消息与 nil myImage 一起传回是一种选择,或者将对象作为可选项传回,然后在 self.downloadImageAtPath 中检查 nil 是另一种选择。

【讨论】:

  • 哦,太棒了杰伊!你救了我一个不眠之夜!它运作良好。非常感谢
  • @AlphadjoSako 太棒了!很高兴我能帮上忙。如果回答对你有帮助,请务必accept it,这样可以帮助到其他人。
【解决方案2】:

为了完成解决方案,下面的代码用于在 tableView 中获取特定单元格中的图片

 getImageEvent(imagePath: myArray[indexPath.row].partyImagePath) { (image) in

         cell.partyImage.image = image

        }

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2017-12-17
    • 2020-08-05
    相关资源
    最近更新 更多