私は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
...
私はあなたのような同様の問題に実行しています - 私はobserveSingleEvent/.VALUEコールで既存のデータの最初のバッチを取得し、その後、私は最初のフィニッシュの中から観察/ .childAddedコールで重複データを取得しますブロック。今度は2番目の呼び出しがALLデータを返すので、コントローラの負荷が2倍になります。 – Jonny
私は何が起こったのかは分かりません(Firebaseは私には新しいですが、予期せぬ動作をするようです)。しかし、今は最初の呼び出しを控えました。つまり、これ以上のobserveEventType/.valueでは、起動時にデータが2回取得されません。 – Jonny