这是我的代码,用于填充“消耗品”数组(在我的viewDidLoad中调用):
//---------------------- POPULATE CONSUMABLE ARRAY --------------------------------//
private func populateConsumableArray(){
//let the object populate itself.
self.ref?.child("Consumables").observe(.childAdded, with: { snapshot in
let dataChange = snapshot.value as? [String:AnyObject]
let aRequest = Consumable(aDict: dataChange!)
self.consumableArray.append(aRequest)
self.consumableTable.reloadData()
})
}
消耗品类如下所示
public class Consumable{
private var type:String
private var count:String
private var sku:String
init (aDict: [String: AnyObject]){
self.type = aDict["Type"] as! String
self.count = aDict["Count"] as! String
self.sku = aDict["SKU"] as! String
}
数据很好地填充了我的表格视图...下面是工作代码的图片...
如上面的两幅图所示,代码可以很好地加载数据...数组也可以很好地填充,未显示,因为它与问题没有直接关系。 下面是数据库结构的图片:
现在,当通过我的添加函数添加新的消耗品时,添加的子项仅抓住添加到消耗品上的第一个属性。 (也未包括在内,因为我确信它可以正常工作,因为它会在线填充Firebase数据库,我将显示它)
第一个属性是“类型”,我切换了将事物添加到Firebase的顺序,首先添加了“计数”,最后计数是唯一获取的属性。请参阅下图了解我的意思...
现在您可以看到,“类型”是唯一获取并存储在dataChange字典中的属性,而不是“类型”,“计数”和“ Sku”。
这是我的Firebase数据库在上述断点处的样子,因此我知道将消耗品添加到firebase的情况很好,当将一个新的孩子添加到“消耗品”父级时,抓住它们只是一个问题:
然后,当然,失败发生在我的Consumable对象init函数中,因为传递的字典中没有'Count'和'Sku'。故障见下文:
如果我关闭并重新加载应用程序,则表视图将加载所有数据,甚至包括我先前添加的使应用程序崩溃的数据。所以我的问题是,为什么我的populateConsumableArray函数不能抓住“ Consumables”父级的所有子级?
出于麻烦,我将在下面添加我的addConsumableToFirebase()函数,以防万一由于某种原因而出现问题...
答案 0 :(得分:1)
在我开始之前,请以文本形式而不是图片形式发布代码,这样我们实际上可以根据需要复制并粘贴...(您大都这样做,但是问题确实出在您发布的最后一张照片中)
现在,查看Firebase文档如下:
写入的效果将立即可见,并且将触发相应的事件。数据到Firebase数据库服务器的同步也将开始。
这就是为什么您看到它仅用Type
立即调用的原因。
请尝试尝试提供的函数来同时更新多个值:
func updateChildValues(_ values: [AnyHashable : Any])
编辑: 删除了有关可能导致保留周期的部分,因为您没有弱力地捕获自己,但是正如注释中指出的那样,它不适用于此处。