2017-07-27 10 views
0

私はUICollectionViewControllerを持っており、Firebaseデータベースからデータを取得して表示します。これはウィンドウのルートビューコントローラなので、常に存在します。私の問題は、コントローラが現れるたびに、観測ノードの子がすべてコレクションビューに追加されることです。これは最初は問題ありませんが、コントローラを離れて戻ると、同じデータがすべて追加され、重複が作成されます。ここではいくつかの擬似コードは、Firebaseと私の相互作用を表す、次のとおりです。この擬似コードでSwift Firebaseは.childAddで観測します。複製データの取得

class ViewController: UIViewController { 

    var children_query: DatabaseQuery! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.children_query = Database.database().reference().child("children").queryOrdered(byChild: "timestamp").queryStarting(atValue: Date().timeIntervalSince1970) 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     self.observeAddedChildren() 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 
     self.children_query.removeAllObservers() 
    } 

    func observeAddedChildren() { 
     self.children_query.observe(.childAdded, with: { snapshot in 
      print(snapshot.value) 
     }) 
    } 

} 

、代わりにUIを扱う、私は単にsnapshotを印刷するが、ポイントが残っています。コントローラーが出現するたびに、すべての子供が印刷されます。 のデータのみを取得するにはどうすればよいですか?ありがとう。

答えて

0

私はFirebaseを使用していませんが、ブロックをobserve関数に渡すと、ビューが消えたときに観測が停止することを示唆するものはありません。

observeを複数回呼び出すのが問題なのでしょうか。 ViewDidLoadでobserveを一度だけ呼び出そうとしましたか?また

、観測が開始されているかどうかを記録する性質があります。

var observing: Bool = false 

func observeAddedChildren() { 
    if observing { 
     return false 
    } 

    self.children_query.observe(.childAdded, with: { snapshot in 
     print(snapshot.value) 
    }) 
    observing = true 
} 

編集:あなたは、おそらく配列または他のコレクションにsnapshot項目を追加しているので、ここでは、カップルより多くの方法だがあなたのUICollectionViewDataSourceはその配列から読み物を読み込んでいます。

だから、次のいずれか

  1. 、その後viewWillAppearと内部のこの配列はself.collectionView.reloadData()を呼び出す、または
  2. あなたsnapshotオブジェクトは、固有の識別子プロパティを持っている場合は、その配列にこれを入れ、その後、ブロックができ観測アイテムを無視することは、すでにこのよう

前に見ています:

var snapshotIDs : [String] = Array<String>() 

func observeAddedChildren() { 
    self.children_query.observe(.childAdded, with: { snapshot in 
     if !snapshotIDs.contains(snapshot.uniqueID) { 
      print(snapshot.value) 
      snapshotIDs.append(snapshot.uniqueID) 
     } 
    }) 
} 
+0

私は 'viewWillDisappear'で' self.children_query.removeAllObservers() 'を呼び出しています。最終的には、ビューが表示されていないときを観察したくありません。しかし良い考え。私はこのような問題を解決できるかもしれません。 –

+0

私はそれを得る。しかし、 'removeAllObservers'を呼び出すと、ビューが再び見えるようになったときに' observe'すると、あなたが観察していることは、既にコレクションビューにいくつかのアイテムを追加していることを知らないことになります。したがって、(1)コレクションビューからすべてのアイテムを 'viewWillAppear'で削除するか、(2)_you_はどのアイテムがすでに配列に追加されているかを追跡し、オブザーバで再び見られる場合は無視しなければなりませんブロック。 – Matthew

+0

@ArchieGertsman編集済みの回答を見る – Matthew

関連する問題