Здравствуйте
В моем приложении изображения в TableViewCell подгружаются из Firebase Storage если его нету, а если он есть то берется из FileManager.
Это работает так:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! StartTVCell
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("image").appendingPathComponent(filterAll[indexPath.row].image + ".jpg")
if FileManager.default.fileExists(atPath: fileURL.path) {
print("Yes image in directory")
cell.imageV.image = loadImage(filterAll[indexPath.row].image)
} else {
print("No image in directory")
let queue = DispatchQueue.global(qos: .userInteractive)
queue.async {
self.writeLocal(filterAll[indexPath.row].image)
DispatchQueue.main.async {
cell.imageV.image = self.loadImage(filterAll[indexPath.row].image)
}
}
}
return cell
}
Это функция подгрузки изображения из FileManager
func loadImage(_ image1: String) -> UIImage? {
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("image").appendingPathComponent(image1 + ".jpg")
if FileManager.default.fileExists(atPath: fileURL.path) {
do {
return UIImage(data: try Data.init(contentsOf: fileURL))
} catch {
print("error getting image")
}
} else {
print("No image in directory")
}
return UIImage(named: "")
}
Это функция загрузки изображения из Firebase Storage в FileManager.
func writeLocal(_ image1: String) {
let localURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("image").appendingPathComponent(image1 + ".jpg")
Storage.storage().reference().child("image").child(image1 + ".jpg").write(toFile: localURL) { url, error in
if let error = error {
print("write image no", error)
} else {
//self.tableView.reloadData()
print("write image save yes")
}
}
}
Код полностью рабочий, но есть небольшая проблема…
Незагруженные изображения из Firebase Storage загружаются какое-то время и ячейки остаётся пустыми, изображения появляются только после скроллинга (то есть обновлении ячеек).
Как сделать чтобы изображения появлялись после загрузки сами?
Можно поставить self.tableView.reloadData() в функции func writeLocal(_ image1: String), но тогда при скроллинге все очень сильно дергается!