在 swift firebase 中添加新孩子后填充数组

Posted

技术标签:

【中文标题】在 swift firebase 中添加新孩子后填充数组【英文标题】:populate array after adding a new child in swift firebase 【发布时间】:2019-12-13 20:25:45 【问题描述】:

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

Consumable 对象类如下所示

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
    

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

正如您从上面的两张图片中看到的那样,代码可以很好地加载数据...数组也可以很好地填充,因为它与问题没有直接关系,所以没有显示。 下图是数据库结构图:

现在,当通过我的 add 函数添加新消耗品时,添加的孩子只会抓取添加到消耗品的第一个属性。 (也不包括在内,因为我确信它工作正常,因为它在线填充了 firebase 数据库,我将展示)

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

添加测试耗材:

现在您可以看到,“Type”是唯一被抓取并存储在 dataChange 字典中的属性,而不是“Type”、“Count”和“Sku”。

这就是我的 firebase 数据库在上述断点处的样子,所以我知道消耗品正在添加到 firebase 中,这只是在将新子级添加到“消耗品”父级时抓取它们的问题:

然后,当然,失败发生在我的 Consumable 对象 init 函数中,因为“Count”和“Sku”不在传递的字典中。故障见下图:

如果我关闭并重新加载应用程序,表格视图会加载所有数据,甚至是我之前添加的导致应用程序崩溃的数据。所以我的问题是,为什么我的 populateConsumableArray 函数不能抓取“Consumables”父级的所有子级?

为了它,我将在下面添加我的 addConsumableToFirebase() 函数,以防万一这是出于某种原因的问题......

【问题讨论】:

【参考方案1】:

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

现在,查看 Firebase 文档如下:

setValue(_:) 说:

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

这就是为什么您会看到它只使用 Type 立即调用。

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

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

编辑: 删除了关于可能导致保留周期的部分,因为您不会弱捕获自我,但正如 cmets 中指出的那样,它不适用于此处。

【讨论】:

只是一个简短的说明。 Firebase 数据库闭包不会转义,也不需要使用弱。此外,在问题中,self 没有像self.closure = this_closure 那样保留对闭包的引用。 self.ref 是对 Firebase 路径的引用,而不是对闭包本身的引用。 Firebase Docs 显示了observe 的函数结构。 啊这就是为什么我说可能,没有完整的上下文/我也不知道 firebase 是如何工作的 - 生病编辑感谢澄清

以上是关于在 swift firebase 中添加新孩子后填充数组的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 数据比较 swift

Swift Firebase 快照查询缺少孩子

每次在 firebase 实时数据库中添加新孩子时使用 firebase 函数发送推送通知不起作用

从 firebase (Swift) 获取子节点

如何从 Firebase (Swift) 中删除一个孩子

Firebase如何向所有孩子添加新数据