在 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 中添加新孩子后填充数组的主要内容,如果未能解决你的问题,请参考以下文章