我想将Struct中的所有信息上传到Firebase,但是我只想添加第一项即可上传。我还在tableView
中显示Struct,效果很好。
结构文件:
struct Products {
var name: String = ""
var amount = Int()
}
var prodItems : [Products] = []
该结构填充有一个按钮:
(name
变量是从先前的ViewController
传递过来的)
@IBAction func addItemButton(_ sender: UIButton){
if let index = i prodItems.index(where: { $0.name == name }) {
prodItems[index].amount += 1
} else {
prodItems.append(Products(name: name, amount: 1))
}
}
该结构将这样填充tableView:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "SummaryCell") as! SummaryTableViewCell
name = prodItems[indexPath.row].name
let amount = prodItems[indexPath.row].amount
cell.summaryLabel.text = "\(amount) \(name)"
return cell
}
以上所有方法都能正常工作,当我尝试上传到Firebase时出现问题。
我正在尝试像这样上载到Firebase:
@IBAction func orderButton(_ sender: UIButton) {
for items in prodItems {
let firebaseData = "\(items.amount) \(items.name)"
let data = ["Uploaded" : timeStamp, "Order" : firebaseData] as [String : Any]
self.ref?.child("Orders").child(childByAutoId).updateChildValues(data, withCompletionBlock: { (error, ref) in
if error != nil{
print(error!)
return
}
break
}
}
使用此设置,我只能将添加的第一个项目上传到Firebase。
如果用户先添加1双鞋,然后再向购物车添加1条牛仔裤,则Firebase将只获得1双鞋。
如何让Firebase接收整个订单?
EDIT
我希望它是:... "Order:" 2 Shoes, 1 Jeans, 3 Hats"
没有子项“ Order”之后的0,1,2等,以此类推
答案 0 :(得分:0)
问题是由于updateChildValues
会更新特定子项的整个值,您正在for循环内调用它。尝试一次创建字典数组,然后直接设置整个数组。这样。
let arrayOfDic = prodItems.map({ ["Uploaded" : timeStamp, "Order" : "\($0.amount) \($0.name)"] })
self.ref?.child("Orders").child(childByAutoId).updateChildValues(arrayOfDic, withCompletionBlock: { (error, ref) in
if error != nil{
print(error!)
}
})
编辑:如果您想将order设置为字符串值,请按以下步骤进行设置。
let order = array.map({ String(format: "%d %@", $0.amount, $0.name) }).joined(separator: ", ")
let dic = ["Uploaded" : timeStamp, "Order" : order]
self.ref?.child("Orders").child(childByAutoId).updateChildValues(dic, withCompletionBlock: { (error, ref) in
if error != nil{
print(error!)
}
})