Swift 4: выборка изображений из хранилища Firebase и отображение их в виде таблицы - PullRequest
0 голосов
/ 28 августа 2018

Я не нашел ни одного хорошего примера / кода для извлечения изображения из хранилища / базы данных 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
        }
    })

   }
}

Я не вижу никаких ошибок, и приложение не падает, однако, когда я нажимаю кнопку, чтобы привести меня к телевизору, оно просто пустое.

1 Ответ

0 голосов
/ 29 августа 2018

Это может быть что-то столь же простое, как перезагрузка вашего tableView. Помните, что ваш запрос данных к серверам Firebase не будет возвращаться мгновенно, так как это сетевой вызов, и поэтому может быть так, что ваша таблица «установила» себя, прежде чем данные вернутся. Чтобы исправить это, вы должны использовать tableView.reloadData(). Вы можете поместить это в конец вашей loadArrayOfImages() функции следующим образом:

...
cell.imageView?.image = pic
tableView.reloadData()
...