我的代码如何知道Firebase何时完成检索数据?

时间:2016-07-16 05:05:24

标签: swift firebase ios9 firebase-realtime-database

我只想问一下firebase检索数据。如何处理firebase检索数据完成?我没有看到任何完成处理程序。 我想在这个firebase数据检索完成后调用一些函数。我该怎么办?

DataService.ds.POST_REF.queryOrderedByChild("created_at").observeEventType(.ChildAdded, withBlock: { snapshot in
        if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
            let postKey = snapshot.key
            let post = Post(postKey: postKey, dictionary: postDict)
            self.posts.append(post)
        }
    })

3 个答案:

答案 0 :(得分:5)

在Firebase中,并没有真正的“完成”概念。 (当听到&#39;孩子添加&#39;)时。它只是一个数据流(想象有人在初始数据完成之前添加了一条新记录)。您可以使用&#39;值&#39;获取整个对象的活动,但不会像他们添加的那样添加新记录,例如“添加的儿童”。确实

如果您确实需要使用已添加的子项并在可能完成时收到通知,则可以设置计时器。我不太了解,但这是逻辑。

  1. 设置您的孩子已添加&#39;事件
  2. 设置一个计时器,在500毫秒内调用一些finishedLoading()函数。
  3. 每次孩子添加&#39;触发事件,销毁第二步中设置的计时器并创建另一个计时器(即再延长500毫秒)。
  4. 当新数据停止进入时,定时器将停止扩展,finsiLoading()将在500ms后调用。

    500毫秒只是一个编号,使用任何适合。

答案 1 :(得分:1)

将整个代码块写入一个具有完成处理程序的函数中,如下所示:

func aMethod(completion: (Bool) -> ()){
DataService.ds.POST_REF.queryOrderedByChild("created_at").observeEventType(.ChildAdded, withBlock: { snapshot in
        if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
            let postKey = snapshot.key
            let post = Post(postKey: postKey, dictionary: postDict)
            self.posts.append(post)
        }
      completion(true)
    })
}

然后在某处调用它:

aMethod { success in
guard success == true else {
//Do something if some error occured while retreiving data from firebase
return
}
//Do something if everything went well.
.
.
.

答案 2 :(得分:0)

对SingleEventOfType(.Value)执行一次请求。这将一次性为您提供所有信息,允许您在获得该数据后执行您想要完成的任何功能。

您可以为childAdded创建单独的查询,然后在添加新帖子时执行您想要执行的任何操作