在Swift Firebase中添加新子代后填充数组

时间:2019-12-13 20:25:45

标签: ios swift firebase firebase-realtime-database

这是我的代码,用于填充“消耗品”数组(在我的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
    }

数据很好地填充了我的表格视图...下面是工作代码的图片... enter image description here

enter image description here

如上面的两幅图所示,代码可以很好地加载数据...数组也可以很好地填充,未显示,因为它与问题没有直接关系。 下面是数据库结构的图片: enter image description here

现在,当通过我的添加函数添加新的消耗品时,添加的子项仅抓住添加到消耗品上的第一个属性。 (也未包括在内,因为我确信它可以正常工作,因为它会在线填充Firebase数据库,我将显示它)

第一个属性是“类型”,我切换了将事物添加到Firebase的顺序,首先添加了“计数”,最后计数是唯一获取的属性。请参阅下图了解我的意思...

添加测试耗材: enter image description here

现在您可以看到,“类型”是唯一获取并存储在dataChange字典中的属性,而不是“类型”,“计数”和“ Sku”。 enter image description here

这是我的Firebase数据库在上述断点处的样子,因此我知道将消耗品添加到firebase的情况很好,当将一个新的孩子添加到“消耗品”父级时,抓住它们只是一个问题: enter image description here

然后,当然,失败发生在我的Consumable对象init函数中,因为传递的字典中没有'Count'和'Sku'。故障见下文: enter image description here

如果我关闭并重新加载应用程序,则表视图将加载所有数据,甚至包括我先前添加的使应用程序崩溃的数据。所以我的问题是,为什么我的populateConsumableArray函数不能抓住“ Consumables”父级的所有子级?

出于麻烦,我将在下面添加我的addConsumableToFirebase()函数,以防万一由于某种原因而出现问题... enter image description here

1 个答案:

答案 0 :(得分:1)

在我开始之前,请以文本形式而不是图片形式发布代码,这样我们实际上可以根据需要复制并粘贴...(您大都这样做,但是问题确实出在您发布的最后一张照片中)

现在,查看Firebase文档如下:

setValue(_:)说:

  

写入的效果将立即可见,并且将触发相应的事件。数据到Firebase数据库服务器的同步也将开始。

这就是为什么您看到它仅用Type立即调用的原因。

请尝试尝试提供的函数来同时更新多个值:

func updateChildValues(_ values: [AnyHashable : Any])

编辑: 删除了有关可能导致保留周期的部分,因为您没有弱力地捕获自己,但是正如注释中指出的那样,它不适用于此处。