2017-01-14 2 views
0

Задача: См. video. Я загружаю изображения из хранилища Firebase и выводя их на ячейку таблицы. После того, как я создаю приложение, изображения не отображаются в первых ячейках табличного представления. После прокрутки вниз и резервного копирования я вижу изображения в первых ячейках таблицы.UIImage не отображается в виде таблицы до прокрутки

Я консультировался это question (клиринговые данные приложения & кэш тренажера не работали), и это question (другая проблема б/с они загрузив изображение из URL). Я прочитал this об использовании образа-заполнителя, но я не уверен, что он применим, потому что я не использую SDWebImage, и моя ячейка использует мой собственный companyImageUIImageView, а не imageView, который поставляется с ячейкой UITableView.

Код:

Company View Controller:

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

компании Table View Cell

class CompanyTableViewCell: UITableViewCell { 
     
    @IBOutlet weak var companyImage: UIImageView! 
  
    override func awakeFromNib() { 
        super.awakeFromNib() 
        companyImage.contentMode = .scaleAspectFit 
    } 
} 
+0

Добро пожаловать. Вы хотя бы попытались использовать образ заполнителя? Если это решение работает для 'SDWebImage', оно должно быть применимо здесь. Я бы по крайней мере рекомендовал попробовать, чтобы увидеть, что происходит. – Pierce

+0

Вы пытались отладить, возвращает ли 'company.image' что-либо в функции' tableView: cellForRowAt: 'для первой загрузки экрана? –

+0

О, ладно, я просто сделал это, потому что для первого загружаемого экрана все изображения семи ячеек возвращают 'nil', но когда я прокручиваю вниз и прокручиваю назад, я получаю' Необязательный (, {1998, 496 }) ',' Необязательно (, {646, 218}) 'и т. Д. – 14wml

ответ

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) 
     } 
    }) 
} 
Смежные вопросы