来自 firebase 的数据未填充到我的表格视图中

Posted

技术标签:

【中文标题】来自 firebase 的数据未填充到我的表格视图中【英文标题】:Data from firebase not populating in my table view 【发布时间】:2019-12-16 20:55:39 【问题描述】:

所以我最近问了一个关于 firebase 的问题 - 但我对我的代码进行了相当多的重构,因为我希望我的所有 firebase 方法都在同一个地方完成。重构后我遇到以下问题...

我的 firebase 数据库中的数据没有填充我的 tableview。我不太清楚为什么会这样,因为在我将方法从我的表格视图移到单独的文件之前它工作正常(为了更清晰的代码)。我所做的只是将填充数组的方法移动到一个单独的文件中,返回一个数组,然后在调用该方法后重新加载 tableview。以下是有问题的代码:

在我的 FireBaseMethods 类中

//-------------- POPULATE TABLE ARRAY -----------------//
    public func populateConsumableTableArray() -> [Consumable]
        var tableArray = [Consumable]()

        //let the object populate itself.
        ref.child("Consumables").observe(.childAdded, with:  snapshot in
            let dataChange = snapshot.value as? [String:AnyObject]
            let aRequest = Consumable(aDict: dataChange!)
            tableArray.append(aRequest)
        )
        return tableArray
    

在我的 ListOfConsumablesViewController 表视图类中

class ListOfConsumablesViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate 

    private var methods:MethodsForController = MethodsForController()
    private var fireBaseMethods:FireBaseMethods = FireBaseMethods()

    private var consumableArray = [Consumable]()

    let picker = UIImagePickerController()

    @IBOutlet weak var consumableTable: UITableView!

    //-------------------- VIEW DID LOAD -----------------------//
    override func viewDidLoad() 
        super.viewDidLoad()

        //Trying to populate the table view here...
        consumableArray = fireBaseMethods.populateConsumableTableArray()
        consumableTable.reloadData()

        self.consumableTable.dataSource = self
        self.consumableTable.delegate = self
    

...

    //---------------------- FUNCTIONS FOR TABLE VIEW CELLS & TABLE ----------------------//
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        print(consumableArray.count)
        return consumableArray.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "consumableCell", for: indexPath) as! ConsumablesCell

        cell.layer.borderWidth = 1
        cell.layer.borderColor = UIColor.lightGray.cgColor
        cell.backgroundColor = UIColor.white
        cell.adapterType.text = consumableArray[indexPath.row].getType()
        cell.count.text = String(consumableArray[indexPath.row].getCount())

        if Int(consumableArray[indexPath.row].getCount()) ?? 0 <= 0
            cell.count.textColor = UIColor.red
        else
            cell.count.textColor = UIColor.black
        

        cell.sku.text = consumableArray[indexPath.row].getSku()

        return cell
    

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 90
    

如下所示,表格视图中没有填充任何内容...我假设这与位于单独文件中的方法有关,但我不确定为什么会这样?

【问题讨论】:

请将 Stack Overflow 上的每个帖子限制在一个特定的问题上。 关于第一个问题:observe 异步工作,populateConsumableTableArray 将始终返回一个空数组,因为闭包执行得更晚。您需要一个完成处理程序。无论如何重新加载表格视图之前设置dataSourcedelegate是没有意义的。 我想我对如何设置完成处理程序感到困惑......所以我的方法应该是这样的? public func populateConsumableTableArray(completionHandler: @escaping ([Consumable]) -> Void) 但是如果返回 void,我该如何调用这个方法并将我的数组设置为它呢?还是不应该返回 void? 【参考方案1】:

完成处理程序的简单实现

//-------------- POPULATE TABLE ARRAY -----------------//
public func populateConsumableTableArray(completion: @escaping (Consumable) -> Void) 

    //let the object populate itself.
    ref.child("Consumables").observe(.childAdded, with:  snapshot in
        guard let dataChange = snapshot.value as? [String:AnyObject] else  return 
        let aRequest = Consumable(aDict: dataChange)
        completion(aRequest)
    )


override func viewDidLoad() 
    super.viewDidLoad()
    self.consumableTable.dataSource = self
    self.consumableTable.delegate = self

    //Trying to populate the table view here...
    fireBaseMethods.populateConsumableTableArray  [unowned self] consumable in 
       self.tableArray.append(consumable)
       DispatchQueue.main.async 
           self.consumableTable.reloadData()
       
    

【讨论】:

非常感谢您的帮助。抱歉,我对 Firebase 非常陌生。不过,我真的很感谢您的帮助! 这个问题与 Firebase 没有特别的关系。几乎所有的数据库和网络请求都是异步工作的。

以上是关于来自 firebase 的数据未填充到我的表格视图中的主要内容,如果未能解决你的问题,请参考以下文章

FireBase 实时数据库:回收站视图未填充

swift:来自firebase的照片未显示在表格视图中

UITableView 未加载 Firebase 快照数据。

Recyclerview 未显示来自 Firebase Kotlin 的数据

图像未显示在表格视图中

使用来自 firebase 实时数据库的 json 数据填充 firestore 数据库