본문으로 바로가기

보통 파이어베이스에서 대량의 데이터를 불러올 때는 파이어 베이스에서 자체 제공하는 인터페이스 리스너를 사용한다.

val valueEventListener: ValueEventListener = object:ValueEventListener {
	override fun onDataChange(snapshot: DataSnapshot) {
    //..
   	}
}

db.addValueEventListener(valueEventListener)

이 때 특히, 데이터를 줄곧 옵저빙 하지 않아도 되는 경우에는 db 송수신 시의 호출 부담을 줄이기 위해

addSingleValueEventListner 라는 파이어베이스 고유의 인터페이스 메소드를 사용한다.

이러면 데이터를 불러올때 최초 한번만 함수가 작동하게 된다.

 

val valueEventListener: ValueEventListener = object:ValueEventListener {
	override fun onDataChange(snapshot: DataSnapshot) {
    //..
   	}
}

db.addListenerForSingleValueEvent(valueEventListener)

테스트를 하다 문제가 생겼다.

좋아요 버튼을 눌러도 뷰에 아무런 변화도 없었던 것. (좋아요 수도 올라가지 않았고, 좋아요 상태에 따라 하트 모양이 변하지도 않음.)

 

분명 MVVM에 맞게 작성한 코드였기에 원인을 찾기 위해 꽤나 시간을 들였다. 

뒤늦게 발견한 원인은 위의 SingleValueEvent 가 문제였다. 

리뷰를 불러오기 위해 송수신 부담을 줄이기위해 Single로 선언했었는데, 이가 문제가 되어 좋아요 버튼이 작동하지 않았던 것이다.

 

좋아요와 같은 실시간 이벤트를 관찰하려면 결국 옵저빙을 해야하고, db를 Single이 아닌 일반 ValueEventListner로 등록하여 사용하여야 한다.

 

쉽게 해결할 수 있던 문제였으나 뷰모델 클래스 쪽을 잘 살펴보지 않아서 일어난 일이다.

데이터와 관련된 작업은 전부 뷰모델 클래스에서 하고 있으니 그 쪽을 잘 봐야한다.