Ios UIImage在滚动之前不显示在表格视图单元格中

Ios UIImage在滚动之前不显示在表格视图单元格中,ios,swift,uitableview,uiimage,firebase-storage,Ios,Swift,Uitableview,Uiimage,Firebase Storage,问题:请参阅。我正在从Firebase存储下载图像并显示在表视图单元格中。构建应用程序后,图像不会显示在表视图的第一个单元格中。在向下和向上滚动时,我可以在表格视图的第一个单元格中看到图像 我查阅了这个(清除应用程序数据和模拟器的缓存不起作用)和这个(不同的问题b/c他们从url下载图像)。我读过关于使用占位符图像的内容,但我不确定它是否适用,因为我没有使用SDWebImage,我的单元格使用我自己的companyImageUIImageView而不是UITableView单元格附带的image

问题:请参阅。我正在从Firebase存储下载图像并显示在表视图单元格中。构建应用程序后,图像不会显示在表视图的第一个单元格中。在向下和向上滚动时,我可以在表格视图的第一个单元格中看到图像

我查阅了这个(清除应用程序数据和模拟器的缓存不起作用)和这个(不同的问题b/c他们从url下载图像)。我读过关于使用占位符图像的内容,但我不确定它是否适用,因为我没有使用SDWebImage,我的单元格使用我自己的
companyImage
UIImageView
而不是
UITableView
单元格附带的
imageView

代码:

公司视图控制器:

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
     }
}

我终于找到了一个相当不错的解决加载映像问题的方法(但不是内存问题)。我用过这个

之前,我在图像下载之前返回公司对象。相反,在我更新的方法中,我将图像分配给主队列上的company对象,因为那时我知道company对象有一个图像,所以我也重新加载表视图

注意:这个解决方案并不完美,因为我确实注意到,当我第一次打开这个视图控制器时,需要等待一段时间才能加载所有图像,但这是迄今为止我找到的最好的解决方案

更新代码

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)
        }
    })
}

欢迎回来。您是否至少尝试过使用占位符图像?如果该解决方案适用于
SDWebImage
,那么它在这里仍然适用。我至少建议您尝试一下,看看会发生什么。您是否尝试过调试
company.image
是否在
tableView:cellForRowAt:
函数中为第一次屏幕加载返回任何内容?哦,好的,我刚刚这么做了,对于第一次屏幕加载,所有七个单元格的图像都返回
nil
,但是当我向下滚动并向上滚动时,我得到了
可选(,{1998,496})
可选(,{646,218})
,请注意,您是否尝试了您链接的问题的答案,即删除应用程序并重新安装它?顺便说一句,如果您是从
.xib
文件加载您的手机,删除第一行
register
companyTableView.register(CompanyTableViewCell.self,forCellReuseIdentifier:“CompanyTableViewCell”)
。你只需要第二个答案如果另一个人偶然发现这个答案,如果你的问题不是一个简单的比赛条件与您的加载,它也可能是由于自动布局和您的限制和显示系统计算,您的看法是不可见的屏幕上。如果您知道您的问题不是由于竞争条件造成的,请尝试调整自动布局约束。