首页 > 解决方案 > 如何在 Swift 中为图像使用 URL?

问题描述

我正在尝试从我的 Firebase 数据库(个人资料图片)中检索某些数据。如您所见,这是来自 UITableViewCell。我有一个我想要覆盖的 imageView 的 @IBOutlet。

当视图唤醒时,您可以看到我经过,并确保我可以获取信息。我知道如何从 Firebase 检索数据,但不知道照片 URL,然后转换为照片本身。

我不确定为什么它不起作用。我收到一个错误,并将在下面显示。有可能是因为 URL 解包的东西,或者好像 Firebase 的格式不正确,但我认为是这样。

错误信息 :Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

import UIKit
import FirebaseAuth
import FirebaseDatabase
import Firebase

class ProfileCellControler: UITableViewCell {

    @IBOutlet var name : UILabel!
    @IBOutlet var rating : UILabel!
    @IBOutlet var imageViewPro : UIImageView!

    var databaseRefer : DatabaseReference!
    var databaseHandle : DatabaseHandle!

    override func awakeFromNib() {
        super.awakeFromNib()

        var urlString = ""
        let urll = URL(string: urlString)!

        databaseRefer = Database.database().reference()
        let userID = Auth.auth().currentUser!.uid

        databaseHandle = databaseRefer.child("Users").child(userID).child("Profile").child("Profile Name").observe(.value, with: { (data) in
            print(String((data.value as? String)!))
            self.name.text = "\(String((data.value as? String)!))"
            print("Done")
        })

        databaseHandle = databaseRefer.child("Users").child(userID).child("Profile").child("Stars").observe(.value, with: { (data) in
            print(String((data.value as? String)!))
            if ((String((data.value as? String)!)) == "N/A") {
                self.rating.text = "No Rating"
            } else {
                self.rating.text = "\(String((data.value as? String)!)) ★"
            }
            print("Done")
        })

        databaseHandle = databaseRefer.child("Users").child(userID).child("Profile").child("Profile Image").observe(.value, with: { (data) in
            print(String((data.value as? String)!))
            print("Done \(String((data.value as? String)!))")
            urlString = (String((data.value as? String)!))
        })

        ImageService.downloadImage(withURL: urll) { (image) in
            self.imageViewPro.image = image
        }

        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

看一下我的代码,看不懂的就用这里的代码

标签: iosswiftfirebaseurlfirebase-realtime-database

解决方案


发现 URL 的字符串为零,因为您正在创建调用以在urll使用数据库中的值初始化之前为您的 url 下载图像:

  databaseHandle = databaseRefer.child("Users").child(userID).child("Profile").child("Profile Image").observe(.value, with: { (data) in
            print(String((data.value as? String)!))
            print("Done \(String((data.value as? String)!))")
            urlString = (String((data.value as? String)!))
        })

observe(.value, with: )因此是异步操作

ImageService.downloadImage(withURL: urll) { (image) in
            self.imageViewPro.image = image
    }

被调用之前observe(.value, with:)被解决。我建议将下载 URL 的回调移动到完成内.observe(:value, :with)或使用大中央调度来更好地控制流程。

作为旁注,我强烈推荐SDWebImage来处理您的图像下载需求,因为它可以使用默认图像进行配置,以应对图像加载失败等情况。


推荐阅读