首页 > 解决方案 > 如何将源自 Firebase、转换为 UIImage 的数据存储到 UIImage 数组?

问题描述

我正在尝试检索从数据库中保存的图片(在这种情况下,我硬编码了我想要从数据库中获取的确切图片)。我UIImage启动了两个变量:imageViewrawImage. imageView 正在使用SDWebImagefromFirebaseUI加载图像,但我不知道如何将其保存到 UIImage 数组中。

rawImage 正在从 Firebase 的确切图像的路径中获取数据。我正在将它转换为 UIImage,但是当我想将它附加到我的 UIImage 数组时,应用程序崩溃了。

class GalleryViewController:UIViewController{
    @IBOutlet weak var imageView: UIImageView!

    @IBOutlet weak var rawImage: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addVerticalGradientLayer(topColor: primaryColor, bottomColor: secondaryColor)
        self.tabBarController?.tabBar.isHidden = true
        retrievePicture()
    }

    func retrievePicture()
    {
        guard let user_email = Auth.auth().currentUser?.email else { return }
        let storageRef = Storage.storage().reference()

        // Reference to an image file in Firebase Storage
        let reference = storageRef.child("\(user_email)").child("/top").child("1.jpg")

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

        // Placeholder image
        let placeholderImage = UIImage(named: "placeholder.jpg")
        //UploadViewController.Clothing.top_images.append(<#UIImage#>)

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


        // this is the code for the rawImage portion I described above
        reference.getData(maxSize: 1 * 1024 * 1024) { data, error in
            if let error = error {
                print("Error \(error)")
            } else {
                let picture = UIImage(data: data!)
                UploadViewController.Clothing.top_images.append(picture!)
            }
        }

        // loading the image to the rawImage imageview
            rawImage.image = UploadViewController.Clothing.top_images[0]

    }
}

标签: arraysswiftfirebasefirebase-realtime-databasefirebase-authentication

解决方案


您忽略了强制展开选项,我建议您删除!使用以避免崩溃,改用以下

reference.getData(maxSize: 1 * 1024 * 1024) { data, error in
    guard let data = data else {
        print(error?.localizedDescription ?? "Check remote url or service")
        return
    }

    if let picture = UIImage(data: data) {
        UploadViewController.Clothing.top_images.append(picture)
    } else {
        print("Invalid image data\n\(String(data: data, encoding: .utf8))")
    }
}

或遵循 if 语句是安全的

if error == nil && data != nil, let picture = UIImage(data: data!) {
    UploadViewController.Clothing.top_images.append(picture)
}

您也可以尝试不带斜杠的路径,如下所示:

let reference = storageRef.child("\(user_email)/top/1.jpg")

推荐阅读