【问题标题】:How to listen for Firebase task completion?如何监听 Firebase 任务完成?
【发布时间】: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 吗?

标签: ios uitableview firebase firebase-realtime-database swift3


【解决方案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 的保留循环.
猜你喜欢
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2011-03-10
  • 2019-04-08
  • 2018-08-19
  • 1970-01-01
相关资源
最近更新 更多