私は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
を印刷するが、ポイントが残っています。コントローラーが出現するたびに、すべての子供が印刷されます。 のデータのみを取得するにはどうすればよいですか?ありがとう。
私は 'viewWillDisappear'で' self.children_query.removeAllObservers() 'を呼び出しています。最終的には、ビューが表示されていないときを観察したくありません。しかし良い考え。私はこのような問題を解決できるかもしれません。 –
私はそれを得る。しかし、 'removeAllObservers'を呼び出すと、ビューが再び見えるようになったときに' observe'すると、あなたが観察していることは、既にコレクションビューにいくつかのアイテムを追加していることを知らないことになります。したがって、(1)コレクションビューからすべてのアイテムを 'viewWillAppear'で削除するか、(2)_you_はどのアイテムがすでに配列に追加されているかを追跡し、オブザーバで再び見られる場合は無視しなければなりませんブロック。 – Matthew
@ArchieGertsman編集済みの回答を見る – Matthew