2017-09-14 23 views
0

オブジェクトのリストを返す関数の補完ハンドラを作成しています。初めて値を返すときは正常に動作します。しかし、firebaseデータベースに何らかの変更が生じ、再び呼び出されるのを観察すると、配列のサイズは倍増します。なぜそれが倍増しているのですか?完了ハンドラSwiftのFirebaseオブザーバ

func getStadiums(complition: @escaping ([Stadium]) -> Void){ 
    var stadiums: [Stadium] = [] 
    let stadiumRef = Database.database().reference().child("Stadium") 
    stadiumRef.observe(.value, with: { (snapshot) in 
    for snap in snapshot.children { 
     guard let stadiumSnap = snap as? DataSnapshot else { 
     print("Something wrong with Firebase DataSnapshot") 
      complition(stadiums) 
      return 
     } 
     let stadium = Stadium(snap: stadiumSnap) 
     stadiums.append(stadium) 
    } 
    complition(stadiums) 
    }) 
} 

そしてこの

getStadiums(){ stadiums 
    print(stadiums.count) // count gets doubled up after every observe call 
} 

答えて

4

使用しているコードでは、オブザーバーの外でstadiumsと宣言しています。これは、データベース参照の値が変更されるたびに、以前に何があったのかを確認せずにstadiumsにデータを追加することを意味します。

func getStadiums(complition: @escaping ([Stadium]) -> Void){ 
    var stadiums: [Stadium] = [] 
    let stadiumRef = Database.database().reference().child("Stadium") 
    stadiumRef.observe(.value, with: { (snapshot) in 
    stadiums.removeAll() // start with an empty array 
    for snap in snapshot.children { 
     guard let stadiumSnap = snap as? DataSnapshot else { 
     print("Something wrong with Firebase DataSnapshot") 
      complition(stadiums) 
      return 
     } 
     let stadium = Stadium(snap: stadiumSnap) 
     stadiums.append(stadium) 
    } 
    complition(stadiums) 
    }) 
} 
+0

ありがとうございます@Jen :)それは本当に働いた –

0

のように実際にあなたの球場データが変更されるたびに呼び出されるオブザーバを追加するこの行stadiumRef.observe(.value, with: { (snapshot) in ...を呼び出します。あなたがgetStadiums(){ stadiums ...を使って、それを2回と呼ばれるので

、添加した総観察者は2回目の呼び出しで二回と呼ばれるラインstadiums.append(stadium)を作る2.

になります。

getStadiums()から電話することなく、stadiumRef.observe()を一度使用することをお勧めします。

関連する問題