使用快速添加的 .Value/.Child 从 Firebase 检索数据时遇到问题
Posted
技术标签:
【中文标题】使用快速添加的 .Value/.Child 从 Firebase 检索数据时遇到问题【英文标题】:Trouble retrieving data from Firebase using .Value/.Child added in swift 【发布时间】:2016-10-19 00:18:18 【问题描述】:我正在从事一个项目,我正在从 firebase 中提取数据(即“排队”)。本质上,数据是用时间戳保存的,所以当它被调用时,它可以按顺序排序(先进先出)。
我面临的问题是在我的应用程序上检索数据时。根据我的研究,在 Stack Overflow 和 firebase 文档中,.Value 提供了一个快照,并在添加新数据时继续监听数据。但是,当添加新数据时,它将拍摄整个集合的新快照(因此在我的应用程序数组上“复制数据”)。
为了解决这个问题,我尝试改用 .ChildAdded,当新数据添加到 firebase 数据库时,它可以很好地向我的数组添加新数据。但是,它并没有添加完整的数据集(数据库中已经存在的数据),这是我除了添加新数据之外还需要的。
假设 firebase 节点是这样的:
App_Queue:
Category1:
Timestamp1:
Uid: User_1_uid
Timestamp2:
Uid: User_2_uid
Swift 代码(2.3):
案例1:
self.databaseRef.child("App_Queue/\(Category1)").queryLimitedToLast(15).observeEventType(.Value, withBlock: (snapshot) in
if let userDict = snapshot.value as? [String:AnyObject]
for each in userDict
let timeIdExtract = each.0 as! String
self.timeIdArray.append(timeIdExtract)
print(self.timeIdArray)
//this gives me full snapshot of time stamps & a userId
//but if timestamp3 and user_3_uid is added to firebase, the array is appended with a new snapshot thus, duplicating items.
案例2:
self.databaseRef.child("App_Queue/\(Category1)").queryLimitedToLast(15).observeEventType(FIRDataEventType.ChildAdded, withBlock: (snapshot : FIRDataSnapshot) in
if let userDict = snapshot.value as? [String:AnyObject]
for each in userDict
let timeIdExtract = each.0 as! String // Every follwers ID.
self.timeIdArray.append(timeIdExtract)
print(self.timeIdArray)
//this gives me only new items added, but not already added.
// if timestamp3 and user_3_uid is added the array is appended with this new item. But timestamp1 & timestamp2 not added
案例 3:
我尝试了 Case1(而不是使用 .observeSingleEventOfType())和 Case2 的混合,方法是在案例 1 的代码后添加 self.databaseRef.removeAllObservers()
,然后为案例 2 打开 .ChildAdded 观察者。它几乎可以工作....通过案例 1 添加了初始快照,然后进行侦听,但是如果说最近添加了时间戳 2,它将在调用案例 2 时再次附加它,从而复制数组。
所以我的问题是:我该如何在数据库中获取现有对象并添加新对象,而不复制数组中的数据?
编辑
我很傻——在块后面有一些无关的代码,这让事情变得糟透了。哦!对于任何遇到问题的人,首先要检查! .ChildAdded 与 observeEventType 配对也成功了。 (获取数据库中已经存在的所有先前数据+在新数据进入时添加新数据)。
self.databaseRef.child("App_Queue/\(Category1)").queryLimitedToLast(15).observeEventType(.ChildAdded, withBlock: (snapshot) in
...
【问题讨论】:
【参考方案1】:我很傻——在块后面有一些无关的代码,这让事情变得糟透了。哦!对于任何遇到问题的人,首先要检查!也 .ChildAdded 与 observeEventType 配对成功了。 (获取数据库中已经存在的所有先前数据+在新数据进入时添加新数据)。
self.databaseRef.child("App_Queue/\(Category1)").queryLimitedToLast(15).observeEventType(.ChildAdded, withBlock: (snapshot) in
...
【讨论】:
我遇到了像你一样的类似问题 - 我通过 observeSingleEvent/.value 调用获取第一批现有数据,然后通过从内部调用 observe/.childAdded 获取重复数据第一个完成块。现在第二个调用返回所有数据,所以我在控制器负载上得到双倍数据。 我不确定发生了什么(Firebase 对我来说是新的,但它的行为似乎有点出乎意料)但现在我放弃了第一次调用,并且只有在使用 observe/.childAdded 时。即没有observeEventType/.value,这样启动时我不会两次获取数据。以上是关于使用快速添加的 .Value/.Child 从 Firebase 检索数据时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
f.select + javascript 从选择菜单中添加和删除 div 样式