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

时间:2017-01-14 19:51:47

标签: ios swift uitableview uiimage firebase-storage

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

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

代码:

公司视图控制器:

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

1 个答案:

答案 0 :(得分:0)

我终于找到了一个相当不错的解决方案来解决加载图像问题(但不是内存问题)。我用了这个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)
        }
    })
}