【问题标题】:How to perform an action only after data are downloaded from Firebase如何仅在从 Firebase 下载数据后执行操作
【发布时间】:2017-03-26 10:53:41
【问题描述】:

我试图弄清楚如何仅在 Firebase 中的 observeSingleEvent 完成工作后触发操作。

背后的原因是我需要做以下操作:

  • 根据用户的一项输入,我需要从数据库中获取一些数据
  • 当这些数据完全下载后,我需要对它们进行一点处理,并用于检索其他要显示给用户的数据

目前我正在使用此代码:

    let listOfTags = [String]()
    var outputArray = [String]()

    if listOfTags.count != 0 {
        for tag in listOfTags {

            ref.child("tags").child(tag).observeSingleEvent(of: .value, with: { (snapshot) in

                if let temp = snapshot.children.allObjects as? [FIRDataSnapshot] {
                    for elem in temp {
                        outputArray.append(elem.key)
                    }
                }

                // ...
            }) { (error) in
                print(error.localizedDescription)
            }
        }

        // HERE I WANT TO DO AN ACTION "ONLY" AFTER THE FOR LOOP IS
        // COMPLETED AND THE "outputArray" IS FILLED WITH ALL VALUES
        doSomethingHere()

    }

但我注意到,当 outputArray 仍然为 EMPTY 时,函数 doSomethingHere() 会立即执行!所以它什么都不做。

那么我的问题是,如何构建程序,以便在下载过程完成后执行此功能?也许observeSingleEvent 不是要使用的正确Firebase 方法?对于这种特定情况,我不想观察任何变化(因为这个列表不会经常变化),我只需要下载数据并稍后对这些数据执行其他操作..

【问题讨论】:

    标签: swift firebase firebase-realtime-database completion


    【解决方案1】:

    Firebase 是异步的,因此要使代码按定义的顺序执行,您需要“等待”firebase 返回数据。

    Firebase 函数附带的闭包就是这样做的 - 闭包中的代码在数据(快照)有效时执行。

    将 doSomethingHere() 移动到 Firebase 闭包中,它将以正确的顺序执行 - 在这种情况下

    if listOfTags.count != 0 {
        for tag in listOfTags {
    
            ref.child("tags").child(tag).observeSingleEvent(of: .value, with: { (snapshot) in
    
                if let temp = snapshot.children.allObjects as? [FIRDataSnapshot] {
                    for elem in temp {
                        outputArray.append(elem.key)
                    }
                    doSomethingHere() //array is populated at this point
                }
            })
        }
    }
    

    请注意,您也可以删除它

    if listOfTags.count != 0
    

    如果 listOfTags 为 0,则 for 循环不会执行。

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2014-04-25
      • 1970-01-01
      相关资源
      最近更新 更多