2016-10-19 81 views
1

我正在從一個項目中抽取Firebase(「排隊」)的數據。基本上數據被保存爲一個時間戳,所以當它被調用時,它可以按順序排列(先進先出)。使用.Value/.Child快速添加到Firebase中檢索數據時遇到問題

我面臨的問題是當我檢索我的應用程序的數據。從我的研究,堆棧溢出以及Firebase文檔中,.Value提供快照並在添加新數據時繼續偵聽數據。但是,當添加新數據時,它將會拍攝整個集合的新快照(因此會在我的應用程序陣列中「複製數據」)。

爲了解決這個問題,我嘗試使用.ChildAdded,它可以很好地向數組添加新數據,當新數據添加到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,在case 1的代碼之後加上self.databaseRef.removeAllObservers(),然後打開caseChild的.ChildAdded觀察者。它幾乎工作....通過案例1添加初始快照,然後偵聽,但如果說,最近添加了timestamp2它將在調用Case2時再次追加,從而複製數組。

所以我的問題:我該如何去獲取數據庫中的現有對象,並添加新的,而不重複數組中的數據?

編輯

林silly--有其扔東西,掉塊後,一些無關的代碼。 DOH!對於任何遇到問題的人,請先查看! .ChildAdded與observeEventType配對也有竅門。 (將所有先前的數據已經存在於數據庫+中,隨着數據的增加而添加新的數據)。

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

回答

0

我很愚蠢 - 有一些無用的代碼後,塊是扔東西了。 DOH!對於任何遇到問題的人,請先查看! .ChildAdded與observeEventType配對也有竅門。 (將所有先前的數據已經存在於數據庫+中,隨着數據的增加而添加新的數據)。

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

我遇到像你這樣的類似的問題 - 我得到的第一批具有observeSingleEvent/.value的調用現有的數據,然後我得到的重複數據與觀察/ .childAdded呼叫從第一整理中塊。現在第二次調用返回所有數據,所以我得到了有關控制器負載的雙重數據。 – Jonny

+0

我不知道發生了什麼(Firebase對我來說是新的,但它似乎有點意外),但現在我放棄了第一個電話,並且只有在使用observe/.childAdded時。即沒有更多的observeEventType/.value,這樣我就不會在啓動時獲得兩次數據。 – Jonny

相關問題