如何收听Firebase任务完成情况?

时间:2016-10-11 21:04:40

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

在此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的观察,但是在课堂上暴露它并背负现有的观察?似乎有点复杂。有没有更好的办法?也许只是阻止,显示和动画?

1 个答案:

答案 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()
    }
}