Swift:无法使用Firebase将数据同步到表格视图

时间:2016-05-18 13:05:00

标签: ios swift uitableview asynchronous firebase

我正在开发一个购物清单应用程序。当我尝试使用Firebase将数据同步到表格视图时,杂货项目无法显示在表格视图中。但是,当我重置模拟器时,之前添加的项目可以显示在表格视图中,但是当我添加另一个项目时,它无法显示在表格视图中。我仔细检查了代码,发现没有错。你可以帮我解决一下吗?(例如,在以下两张图片中,咖啡项目无法显示)

GroceryListViewController.swift中的部分代码

 override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
//Attach a listener to receive updates.
ref.observeSingleEventOfType(.Value, withBlock: { (snapshot) in

    var newItems = [GroceryItem]()

    for item in snapshot.children
    {
        let groceryItem = GroceryItem(snapshot: item as! FDataSnapshot)
        newItems.append(groceryItem)
    }
    self.items = newItems
    self.tableView.reloadData()
    })
}

Simulator Image Firebase Image

3 个答案:

答案 0 :(得分:1)

1 - 您正在使用observeSingleEventOfType(*这相当于observeEventType:withBlock :,除了在返回初始数据后立即取消块。)来自doc。所以你的听众被召唤一次并停止听。请改用observeEventType

2 - 您应该在主线程上执行tableview的reloadData,如下所示:

 NSOperationQueue.mainQueue().addOperationWithBlock({
      self.tableView.reloadData()
 })

原因是您不能/不能从后台线程与UI交互。由于Firebase是异步的,因此完成块位于后台线程

答案 1 :(得分:1)

也许这很明显,但它发生在我身上。我正在调试,代码在断点处停止,而数据不在firebase的控制台中。然后我意识到我必须让它完全运行才能刷新。也许它可以帮助......

答案 2 :(得分:0)

点击按钮" +":

后添加此代码
 self.items.append(groceryItem)
  let row = self.items.count - 1
  let indexPath = NSIndexPath(forRow: row, inSection: 0)
  self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)

这确保了与UI的互动。