嗨,我很难在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)
}
答案 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")
如果运行此代码,将获得以下输出:
在附加观察者之前
附加观察者之后
获得数据
这可能不是您期望数据的顺序。但这确实说明了为什么数组在闭包之后但在代码外为空:数据尚未加载。
为避免出现此问题,所有需要数据的代码都必须在闭包内(从中调用)。另外(如果您对低级同步感到满意),可以在关闭等待之后使用同步原语进行调用。
请参阅:
How do I wait for an asynchronously dispatched block to finish?(使用同步原语)