在此tutorial ,他们的 Firebase 代码分散在整个 Controller 中。由于您的 reload()
代码在现有的 .observe()
中,这使得在 Firebase 返回时重新加载 tableview 变得很容易。
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 的观察,但将其暴露在类里面并从现有的观察中取回?好像有点绕。有没有更好的办法?也许只是 block 和显示和动画?
最佳答案
使用完成处理程序来实现这一点。 示例:
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()
}
}
关于ios - 如何监听 Firebase 任务完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39986699/