2017-01-07 21 views
0

私は数時間戦ってきましたが、2つのことを理解できないようです。Firebase Pagination - Swift 3

  1. は、どのように私は私が「queryLimitedToLast」と「queryEndingAtValue」を使用していますし、今の私の記事がまったく表示されていません。「アイテム」の私の配列にそれらを追加する(最初の最新の投稿をすべて表示することができます。

  2. 私のそれは私の配列に数回の項目を追加した仕事をしていました。事前に

感謝。

ここに私のデシベルです それはアイテムを追加して働いていたときsnapshot sample of my db

は、私はここでfirebaseすることは非常に新しい、私のコードだと、本当にちょうど私が私がここでやっているのか分からない認めるだろう。..

func downloadPostsFromFirebase(withValue: String) { 
     // 1 - Get a reference to the database 
     ref = FIRDatabase.database().reference(withPath: "items-for-sale") 

     var startKey = withValue 

     var count = GlobalConstants.FirebaseConstants.numerOfPostsPerPage 

     var query = ref.queryOrderedByKey() 

     if startKey != nil { 
      query = query.queryEnding(atValue: startKey) 
      count += 1 
     } 

     query.queryLimited(toLast: UInt(count)).observeSingleEvent(of: .value, with: { snapshot in 
      guard var children = snapshot.children.allObjects as? [FIRDataSnapshot] else { 
       // Handle error 
       return 
      } 

      if startKey != nil && !children.isEmpty { 
       // TODO - If the number of items in the array is equal to the number of items in the db now, then stop? 
       for child in snapshot.children { 

        // instance of ItemForSale, it's added to the array that contains the latest version of the data. 
        let itemForSaleSingle = ItemForSale(snapshot: child as! FIRDataSnapshot) 

        startKey = itemForSaleSingle.key 

        self.items.append(itemForSaleSingle) 
        print("Total items count is \(self.items.count)") 
        self.collectionView?.reloadData() 

        print("start key is \(startKey)") 
       } 
      } 
     }) 
    } 
+0

私は以下の2つの回答をしました。投稿ごとに1つの質問に限定してください。ここ数週間で何度も何度も質問に答えてきたことは確かです。 –

答えて

3

私の配列に何度か。

あなたはvalueイベントを待ち受けています。このイベントは、クエリのデータに変更があるたびに発生します。また、発生するたびに、クエリの完全なデータが含まれます。

1 
2 
3 
4 

1 
2 
3 

あなたは4番目の項目を追加する場合次に、あなたと値のイベントを取得する:あなたは、リスト内の3つの項目で始まっている場合、あなたはこれらの三つの項目を得ることを意味

最初のコレクションと重複しているメッセージが表示される理由として、値を追加した後に最初のコレクションと重なっている部分が重なっていることに注意してください。

これを処理する最も簡単な方法は、値イベントの代わりにchild_addedイベントをリッスンすることです。また、あなたのコードが簡単になりchild_addedを使用し

4 

1 
2 
3 

そして、アイテムを追加するときに、あなたがchild_added単一の追加を取得したい:上記のシナリオでは、最初に3つのchild_addedイベントを取得したいですコレクションをもう処理する必要がないからです。

query.queryLimited(toLast: UInt(count)).observeSingleEvent(of: .childAdded, with: { snapshot in 
    // instance of ItemForSale, it's added to the array that contains the latest version of the data. 
    let itemForSaleSingle = ItemForSale(snapshot: snapshot as! FIRDataSnapshot) 
+1

簡単なメモを追加するには:.valueイベントを介して一度にデータのグループを読み込む必要がある場合は、データの重複を避けるため、配列をデータごとに再ロードできるように毎回初期化する必要があります。 self.items = []を閉じてスナップショットを反復する前に、子どもがそれを行います。しかし、@ frankvanpuffelenのように、通常は.childAddedイベントが最適な解決策です。 – Jay

関連する問題