2017-09-14 3 views
0

개체 목록을 반환하는 함수의 완료 핸들러를 만들고 있습니다. 처음으로 값을 반환하면 잘 작동합니다. 그러나 어떤 변화가 firebase 데이터베이스에서 발생하고 다시 관찰되면 배열 크기가 두 배가됩니다. 왜 두 배가 늘었습니까? 이Completion handler Swift의 Firebase observer

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

답변

4

사용중인 코드가 옵서버 외부에 stadiums을 선언합니다. 즉, 데이터베이스 참조 값을 변경할 때마다 이전에 있었던 내용을 지우지 않고 데이터를 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 ... 같은

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 ...를 사용하여 두 번 호출하기 때문에

추가, 총 관찰자는 두 번째 호출에 두 번 호출 라인 stadiums.append(stadium)한다 2.

될 것입니다.

내 제안은 getStadiums()에서 전화하지 않고 stadiumRef.observe()을 한 번 사용하는 것입니다.