问题:请参见video。我正在从Firebase存储下载图像,并在表格视图单元中显示。构建应用程序后,图像不会显示在表格视图的前几个单元格中。上下滚动后,我可以在表格视图的第一个单元格中看到图像。
我咨询了这个question(清除应用程序数据和模拟器的缓存不起作用)和这个question(不同的问题b / c,他们正在从URL下载图像)。我阅读了有关使用占位符图像的this的信息,但是我不确定它是否适用,因为我没有使用SDWebImage,并且单元格使用了自己的companyImage
UIImageView
而不是imageView
随附的UITableView
>单元格。
码:
公司视图控制器:
class CompanyViewController: UIViewController, UISearchBarDelegate, UIScrollViewDelegate, UITableViewDelegate, UITableViewDataSource {
override func viewDidLoad() {
super.viewDidLoad()
companyTableView.register(CompanyTableViewCell.self, forCellReuseIdentifier: "CompanyTableViewCell")
companyTableView.register(UINib(nibName: "CompanyTableViewCell", bundle: nil), forCellReuseIdentifier: "CompanyTableViewCell")
loadData()
}
func loadData() {
databaseHandle = databaseRef?.child("companies").observe(.value, with: { (snapshot) in
for item in snapshot.children.allObjects as! [FIRDataSnapshot] {
let company = Company()
let id = item.childSnapshot(forPath: Property.id.rawValue).value as! String
let imageName = id + ".png"
let imageRef = self.storageRef?.child(imageName)
imageRef?.data(withMaxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
print((error as Error).localizedDescription)
} else if let data = data {
// Data for "images/companyid.png" is returned
company.image = UIImage(data: data)
}
}
self.informationStateController?.addCompany(company: company)
}
DispatchQueue.main.async {
self.companyTableView.reloadData()
}
})
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let company = (self.informationStateController?.companies[indexPath.row])!
let customCell = tableView.dequeueReusableCell(withIdentifier: CompanyTableViewCell.identifier) as! CompanyTableViewCell
customCell.companyImage.image = company.image
return customCell
}
}
公司表格视图单元格
class CompanyTableViewCell: UITableViewCell {
@IBOutlet weak var companyImage: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
companyImage.contentMode = .scaleAspectFit
}
}
最佳答案
我终于找到了一个很好的解决加载映像问题(但不是内存问题)的方法。我用了这个question。
以前,在下载图像之前,我要返回公司对象。取而代之的是,在更新的方法中,我将图像分配给主队列上的公司对象,由于那时候我知道公司对象具有图像,所以我也重新加载了表格视图。
注意:该解决方案并不是完美的,因为我确实注意到,当我第一次打开此视图控制器时,需要等待一段时间才能全部加载图像,但这是迄今为止找到的最好的解决方案。
更新的代码
func loadData() {
databaseHandle = databaseRef?.child("companies").observe(.value, with: { (snapshot) in
for item in snapshot.children.allObjects as! [FIRDataSnapshot] {
let company = Company()
let id = item.childSnapshot(forPath: Property.id.rawValue).value as! String
let imageName = id + ".png"
let imageRef = self.storageRef?.child(imageName)
imageRef?.data(withMaxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
print((error as Error).localizedDescription)
} else if let data = data {
DispatchQueue.main.async { //UPDATED PART OF CODE STARTS HERE
company.image = UIImage(data: data)
self.companyTableView.reloadData()
} //UPDATED PART OF CODE ENDS HERE
}
}
self.informationStateController?.addCompany(company: company)
}
})
}