如何监听 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 [关闭]

仅在 firebase 调用完成时加载布局

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba

Stripe 和 Firebase:FirebaseError:collection() 的第一个参数应为 CollectionReference、DocumentReference 或 Fireba

如何通过 firebase 托管在 firebase 上托管 node.js Web 应用程序(包含多个文件夹)?

Cloud Functions for Firebase:在不触及最大超时的情况下完成长流程