Arvidurs прав в том, что хранит цену как int
и валюту как 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
}
Вам остается только выяснить, как вы хотите хранить эти автоидентификаторы.