ios - 如何在 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
}
}
解决方案
发现 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来处理您的图像下载需求,因为它可以使用默认图像进行配置,以应对图像加载失败等情况。
推荐阅读
- android - 如何将“2019-02-10T19:30:00+00:00”日期格式转换为“19:30”
- android - 为什么我的应用程序按钮会混合并更改其位置?
- django - Django CreateAPIView 不显示创建表单
- winapi - 如何使用 LoadImage 选择图标颜色深度?
- database - 配置 Unifi 控制器以使用外部 MongoDB 数据库 - 可能的角色问题?
- kubernetes - Kubernetes 将自己的域名附加到所有请求
- arrays - 迅速。从对象内部获取对象
- linux - 以前错误的未对齐呼叫现在工作了吗?
- javascript - 窗口大小改变时保持viewBox的比例
- regex - 用于嵌套 XML 标记的 PowerShell 正则表达式