来自 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
将始终返回一个空数组,因为闭包执行得更晚。您需要一个完成处理程序。无论如何重新加载表格视图之前设置dataSource
和delegate
是没有意义的。
我想我对如何设置完成处理程序感到困惑......所以我的方法应该是这样的? 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 的数据未填充到我的表格视图中的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 未加载 Firebase 快照数据。