繁体   English   中英

无法使用swift中添加的.Value / .Child从Firebase检索数据

[英]Trouble retrieving data from Firebase using .Value/.Child added in swift

我正在开发一个项目,我从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() ,然后为case2打开.ChildAdded观察者。 它几乎可以工作....通过案例1添加初始快照,然后监听,如果说最近添加了timestamp2,它​​将在调用Case2时再次追加它,从而复制数组。

所以我的问题是:如何在数据库中获取现有对象并添加新的对象,而不重复数组中的数据?

编辑

我很傻 - 在块之后有一些无关紧要的代码。 DOH! 对于遇到问题的人,首先要检查! 还。与observeEventType配对的.ChildAdded完成了这个技巧。 (获取DB +中已有的所有先前数据,在添加新数据时)。

self.databaseRef.child("App_Queue/\(Category1)").queryLimitedToLast(15).observeEventType(.ChildAdded, withBlock: { (snapshot) in
...

我很傻 - 在块之后有一些无关紧要的代码。 DOH! 对于遇到问题的人,首先要检查! 还。与observeEventType配对的.ChildAdded完成了这个技巧。 (获取DB +中已有的所有先前数据,在添加新数据时)。

self.databaseRef.child("App_Queue/\(Category1)").queryLimitedToLast(15).observeEventType(.ChildAdded, withBlock: { (snapshot) in
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM