如何监听 Firebase 任务完成?
Posted
技术标签:
【中文标题】如何监听 Firebase 任务完成?【英文标题】:How to listen for Firebase task completion? 【发布时间】:2016-10-11 21:04:40 【问题描述】:在这个tutorial 中,他们的 Firebase 代码分散在控制器中。由于您的 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 的观察,但在课堂上公开它并背负现有的观察?好像有点绕。有没有更好的办法?也许只是阻止、显示和动画?
【问题讨论】:
考虑在您的 performCompletedQuery() 中添加一个 completionBlock 吗? 【参考方案1】:使用完成处理程序来实现这一点。 示例:
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()
【讨论】:
你不再使用 .observe() 了吗?[unowned self]
是什么?
现在可以使用了。唯一的事情是,我不需要完成块的参数,但我不知道如何删除它。你对此有什么想法吗?
@4thSpace 简单地将 void 函数作为参数,如下所示: func queryOrdered(completion: () -> ()) completion() ,[unowned self] 用于省略 self 的保留循环.以上是关于如何监听 Firebase 任务完成?的主要内容,如果未能解决你的问题,请参考以下文章
我该如何解决这个问题:Android Studio - Flutter - Dart - firebase [关闭]
Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba
Stripe 和 Firebase:FirebaseError:collection() 的第一个参数应为 CollectionReference、DocumentReference 或 Fireba