2016-10-19 8 views
1

私はfirebaseからデータを取得しているプロジェクトに取り組んでいます(キューに入れられています)。基本的にデータはタイムスタンプ付きで保存されるので、呼び出されると順番に並べ替えることができます(先入れ先出し)。.Value/.Childを使用してFirebaseからデータを取得する際に問題が発生しました

私が直面している問題は、アプリでデータを取得するときです。私の研究では、スタックオーバーフローとFirebaseのドキュメントで、.Valueはスナップショットを作成し、新しいデータが追加されたときに引き続きデータを聴いています。しかし、新しいデータが追加されると、セット全体の新しいスナップショットが作成されます(つまり、アプリの配列に「データを複製する」)。

これを回避するために、新しいデータがfirebaseデータベースに追加されたときに、新しいデータを配列に追加するためにうまく動作する.ChildAddedを代わりに使用しようとしました。しかし、それは完全なデータセット(データベースに既に存在するデータ)を追加しているわけではありません。新しいデータが追加されるだけでなく、必要なものです。

App_Queue: 
     Category1: 
         Timestamp1: 
            Uid: User_1_uid 
         Timestamp2: 
            Uid: User_2_uid 

スウィフトコード(2.3):

ケース1:など

と仮定firebaseノード

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: I試しました Case1のコードの後に​​self.databaseRef.removeAllObservers()を追加し、case2の.ChildAddedオブザーバをオンにすることで、Case1のハイブリッド(.observeSingleEventOfType())& Case2を使用します。ほとんどの場合、最初のスナップショットをケース1で追加した後、timestamp2が最近追加されたときにリスンすると、Case2が呼び出されたときにこれを再度追加して配列を複製します。

私の質問:データベース内の既存のオブジェクトを取得し、新しいオブジェクトを追加する方法については、配列内のデータを複製せずにどうすればよいですか?

EDITは

イムsilly--は、物事をオフに投げていたブロックの後にいくつかの余分なコードを持っていました。 DOH!問題を抱えている人は、まずチェックしてみてください! observeEventTypeとペアになった.ChildAddedもトリックを行いました。 (既にDB +にあるすべての以前のデータを取り込み、新しいデータを追加します)。

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

答えて

0

Im silly--物事を投げていたブロックの後にいくつかの無関係なコードがありました。 DOH!問題を抱えている人は、まずチェックしてみてください! observeEventTypeとペアになった.ChildAddedもトリックを行いました。 (既にDB +にあるすべての以前のデータを取り込み、新しいデータを追加します)。

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

私はあなたのような同様の問題に実行しています - 私はobserveSingleEvent/.VALUEコールで既存のデータの最初のバッチを取得し、その後、私は最初のフィニッシュの中から観察/ .childAddedコールで重複データを取得しますブロック。今度は2番目の呼び出しがALLデータを返すので、コントローラの負荷が2倍になります。 – Jonny

+0

私は何が起こったのかは分かりません(Firebaseは私には新しいですが、予期せぬ動作をするようです)。しかし、今は最初の呼び出しを控えました。つまり、これ以上のobserveEventType/.valueでは、起動時にデータが2回取得されません。 – Jonny

関連する問題