我正在开发一个购物清单应用程序。当我尝试使用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()
})
}
答案 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的互动。