Firebase Observer中存储的内容的寿命

时间:2018-12-26 03:59:28

标签: swift firebase firebase-realtime-database

嗨,我很难在Firebase块中获取数组的值

我的代码涉及计算出订购的多种食品的数量(requestFoodItemArray [i]),并将它们附加到数组(requestFoodNumberArray)中。我能够使其成功运行,但是当我尝试在observe()块内的其他任何地方访问它时,存储在requestFoodNumberArray中的值将消失。

如何“延长”该特定阵列中存储的数据的寿命?

谢谢!

 override func viewDidLoad() {
    super.viewDidLoad()

    populateCharts(completion: { requestNumberArray in
        print(requestNumberArray)
    })

}

func populateCharts (completion: @escaping (_ requestNumberArray: Array<Double>) -> Void)  {
    for i in 0 ..< requestFoodItemArray.count {
    refRequest.child("\(requestFoodItemArray[i])").observe(.value, with: { snapshot in
        var newItem: [FoodRequestItemList] = []
        for child in snapshot.children {
            if let snapshot = child as? DataSnapshot,
                let requestItemList = FoodRequestItemList(snapshot: snapshot) {
                newItem.append(requestItemList)
            }
        }
        self.item = newItem
        self.requestedItemArray = self.item.map({ $0.key })
        var arrayCount : Double = Double(self.requestedItemArray.count)
        var requestArray : [Double] = []
        requestArray.append(arrayCount)
        completion(requestArray)
    }, withCancel: nil)
}

1 个答案:

答案 0 :(得分:1)

从Firebase异步加载数据。加载数据时,其余代码将继续执行。然后,当数据可用时,将调用您的闭包(snapshot in)。

发现requestFoodNumberArray为空的代码只是在调用之前运行 ,因此requestFoodNumberArray仍然为空。

通过添加一些简单的日志语句,您可以最轻松地自己看到这一点:

print("Before attaching observer")
refRequest.child("\(requestFoodItemArray[i])").observe(.value, with: { snapshot in
  print("Got data")
})
print("After attaching observer")

如果运行此代码,将获得以下输出:

  

在附加观察者之前

     

附加观察者之后

     

获得数据

这可能不是您期望数据的顺序。但这确实说明了为什么数组在闭包之后但在代码外为空:数据尚未加载。

为避免出现此问题,所有需要数据的代码都必须在闭包内(从中调用)。另外(如果您对低级同步感到满意),可以在关闭等待之后使用同步原语进行调用。

请参阅: