Я не нашел ни одного хорошего примера / кода для извлечения изображения из хранилища / базы данных Firebase и отображения его в ячейках в базовом табличном представлении. Я посмотрел здесь , но не нашел ничего, что работало. Может кто-нибудь привести полный пример?
Ниже приведен код, который я пытался заставить его работать:
import UIKit
import FirebaseStorage
import FirebaseDatabase
import FirebaseAuth
import Firebase
class TableViewController: UITableViewController {
//TableView datasource methods
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
self.downloadImages(cell: cell, folderPath: "\(Storage.storage().reference().child((Auth.auth().currentUser?.uid)!).child("post\(takePicViewController().finalPost + PhotoArray.sharedInstance.numberPost)").child(ImageUploadManager().imageName))", success: { (img) in
print(img)
}) { (error) in
print(error)
}
// cell.imageView?.image = PhotoArray.sharedInstance.photosArray[indexPath.row] as? UIImage
return cell
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let numberOfRowsInSection = PhotoArray.sharedInstance.photosArray
return numberOfRowsInSection.count
}
func downloadImages(cell: UITableViewCell, folderPath:String,success:@escaping (_ image:UIImage)->(),failure:@escaping (_ error:Error)->()){
for i in 0 ..< 194{
// Create a reference with an initial file path and name
let reference = Storage.storage().reference().child((Auth.auth().currentUser?.uid)!).child("post\(takePicViewController().finalPost + PhotoArray.sharedInstance.numberPost)").child(ImageUploadManager().imageName)
reference.getData(maxSize: (1 * 1024 * 1024)) { (data, error) in
if let _error = error{
print(_error)
failure(_error)
} else {
if let _data = data {
let myImage:UIImage! = UIImage(data: _data)
success(myImage)
}
}
// let cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.imageView?.image = UIImage(data: data!)
}
}
}
}
Я также попробовал следующий код:
В начале ВК я делаю следующее:
// Firebase services
var database: Database!
var storage: Storage!
// Initialize Database, Auth, Storage
override func viewDidLoad() {
database = Database.database()
storage = Storage.storage()
}
Затем я вызываю функцию внутри функции tableView_cellforRowAt indexPath , как показано ниже. И я возвращаю клетку
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
loadArrayOfImages(cell: cell)
return cell
Функция, которую я вызвал, выглядит следующим образом:
func loadArrayOfImages(cell: UITableViewCell) {
let dbRef = database.reference().child((Auth.auth().currentUser?.uid)!).child("post\(takePicViewController().finalPost + PhotoArray.sharedInstance.numberPost)").child(ImageUploadManager().imageName)
dbRef.observe(.childAdded, with: { (snapshot) in
// Get download URL from snapshot
let downloadURL = snapshot.value as! String
// Create a storage reference from the URL
let storageRef = self.storage.reference(forURL: downloadURL)
// Download the data, assuming a max size of 1MB (you can change this as necessary)
storageRef.getData(maxSize: 10 * 1024 * 1024) { (data, error) -> Void in
// Create a UIImage, add it to the array
let pic = UIImage(data: data!)
self.picArray.append(pic!)
cell.imageView?.image = pic
}
})
}
}
Я не вижу никаких ошибок, и приложение не падает, однако, когда я нажимаю кнопку, чтобы привести меня к телевизору, оно просто пустое.