在此tutorial中,他们的Firebase代码分散在整个控制器中。这使得Firebase返回时可以轻松重新加载tableview,因为reload()
代码位于现有.observe()
中。
ref.queryOrdered(byChild: "completed").observe(.value, with: { snapshot in
var newItems: [GroceryItem] = []
for item in snapshot.children {
let groceryItem = GroceryItem(snapshot: item as! FIRDataSnapshot)
newItems.append(groceryItem)
}
self.items = newItems
self.tableView.reloadData()
})
如果Firebase代码在一个类中,如何处理上述内容?我仍然需要重新加载tableview,但只有在Firebase返回后才能重新加载。它看起来像这样:
f.performCompletedQuery()
self.tableView.reloadData()
f.performCompletedQuery()
将执行,但代码路径将继续打开,同时仍在从Firebase检索数据。然后self.tableView.reloadData()
将会触发,表格将为空(因为Firebase尚未返回)。
我想我需要复制Firebase的观察,但是在课堂上暴露它并背负现有的观察?似乎有点复杂。有没有更好的办法?也许只是阻止,显示和动画?
答案 0 :(得分:4)
使用完成处理程序来实现此目的。 例如:
func queryOrdered(completion: (_ result: [Any]) -> ()) {
// request here
// getting response check on error
// set completion for returned itmes if success
completion([1, 2, 3])
}
// call the function
queryOrdered { [unowned self] (arr) in
// get returned items
self.myitems = arr
// reload the table on main queue
DispatchQueue.main.async {
self.tableView.reloadData()
}
}