【问题标题】:How can my code know when Firebase has finished retrieving data?我的代码如何知道 Firebase 何时完成检索数据?
【发布时间】:2016-07-16 05:05:23
【问题描述】:

我只是想询问有关 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)
        }
    })

【问题讨论】:

    标签: swift firebase ios9 firebase-realtime-database


    【解决方案1】:

    在 Firebase 中,实际上并没有“完成”的概念(当听到“添加的孩子”时)。它只是一个数据流(想象有人在初始数据“完成”之前添加了一条新记录)。您可以使用 'value' 事件来获取整个对象,但这不会为您提供新记录,因为它们是像 'child added' 那样添加的。

    如果您确实需要使用添加的子节点并在它可能完成时收到通知,您可以设置一个计时器。我不知道 swift,但这是逻辑。

    1. 设置您的“添加孩子”事件。
    2. 设置一个计时器以在 500 毫秒内调用一些 finishedLoading() 函数。
    3. 每次触发 'child added' 事件时,销毁第二步中设置的计时器并创建另一个计时器(即再延长 500 毫秒)。

    当新数据停止进入时,计时器将停止延长,并且 finsihedLoading() 将在 500 毫秒后被调用。

    500ms 只是一个编造的数字,随便什么都行。

    【讨论】:

      【解决方案2】:

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

      您可以为 childAdded 创建一个单独的查询,然后在添加新帖子时执行您想做的任何事情

      【讨论】:

        【解决方案3】:

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

        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.
        .
        .
        .
        

        【讨论】:

        • 我认为这行不通。完成处理程序将在每次 .childAdded 触发后直接调用,而不是在它们全部完成时调用。
        猜你喜欢
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多