Arvidurs 将价格存储为 aint并将货币存储为 a 是正确的string,但答案对您不起作用的原因是它没有解决您没有正确检索您想要的数据的问题。
您有您的cart文件夹,它包含两个您要检索其属性的产品文件夹。您无法仅通过引用父文件夹来检索和解包这两个文件夹中包含的值cart。您需要单独访问购物车中的每个文件夹:
Database.database().reference().child("users").child(uid).child("cart").child("-Lf59bkQ5X3ivD6ue1SA")
Database.database().reference().child("users").child(uid).child("cart").child("-Lf5MiEGU357HWTMbxv8")
但是,要使其正常工作,您需要访问每个产品autoID的值,因此您需要将每个新产品的childByAutoID值存储到数组或字典中,以便您可以将它们全部用于访问您需要的任何数据。当您将新产品存储到cart文件夹时,您需要实现这一点。我不确切知道您当前如何保存每个产品,但是当您创建要保存到的参考时,您需要执行以下操作:
let newProductRef = Database.database().reference().child("users").child(uid).child("cart").childByAutoId()
let autoID = newProductRef.key
那时,您将能够存储autoID您选择的任何内容,并且可以访问cart文件夹中的所有内容,并且可以遍历所有内容autoIDs并获取所需的任何数据。示例:
func getCartPriceSum(finished: @escaping ([String : Double]) -> Void){
let myGroup = DispatchGroup()
var sum = Double()
var currency = String()
for autoID in autoIdArray{
myGroup.enter()
let productRef = Database.database().reference().child("users").child(uid).child("cart").child(autoID)
productRef.observe(.value) { (snapshot) in
guard
let snapshotValue = snapshot.value as? NSDictionary,
let productPrice = snapshotValue["ProductPrice"] as? Double,
let priceCurrency = snapshotValue["PriceCurrency"] as? String//assuming you've adopted Arvidurs' method of storing the price data
else {
print("productPrice/priceCurreny nil")
return
}
sum += productPrice
currency = priceCurrency
}
myGroup.leave()
}
let priceSum = [currency : sum]
myGroup.notify(queue: .main) {
finished(priceSum)
}
}
你可以这样调用函数:
getCartPriceSum { (priceSum) in
//do whatever you want with the priceSum
}
您唯一需要弄清楚的是您希望如何存储这些 autoID。