使用快速添加的 .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 检索数据时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

python 实现树结构的打印

如何使用 postgres 从 geom 列添加质心列?

f.select + javascript 从选择菜单中添加和删除 div 样式

如何从 CLI 快速重命名 macOS 或 linux 上的文件?

WIN10 无法取消 快速访问 固定

使用ValueListenableBuilder监听TextEditingController