Android/Side Projects

Tinder 앱 개발하기

화요밍 2022. 2. 17. 16:25
728x90
반응형
Side Project - Tinder
회원 가입한 유저들을 매칭해주는 기존 틴더 앱의 간단한 기능을 구현한 프로젝트

 

 

GitHub - hwayeon351/Tinder

Contribute to hwayeon351/Tinder development by creating an account on GitHub.

github.com


학습 회고

오늘은 Firebase Realtime Database에 저장된 유저 목록을 가져와 틴더에 유저 정보를 보여주는 카드를 띄우고, Swipe를 통해 Like or Dislike를 하는 기능을 구현하였다.

 

 


오늘 공부한 내용

  • addListenerForSingleValueEvent

서버의 업데이트 된 값을 확인하는 대신에 로컬 디스크 캐시에서 데이터를 즉시 가져온다.

한 번 로드된 후에 자주 변경되지 않거나 능동적으로 수신 대기할 필요가 없는 데이터에 유용하다.

val currentUserDB = userDB.child(getCurrentUserId())
currentUserDB.addListenerForSingleValueEvent(object: ValueEventListener {
    override fun onDataChange(snapshot: DataSnapshot) {
        if (snapshot.child("name").value == null) {
            showNameInputPopup()
            return
        }

        getUnSelectedUsers()

    }

    override fun onCancelled(error: DatabaseError) {

    }

})

 

 

  • ChildEventListener

ChildEventListener는 노드의 하위 요소에서 발생하는 특정 작업에 대응해서 트리거 된다.

데이터베이스의 특정 노드에 대한 변경사항을 수신 대기할 때 유용하게 사용된다.

 

ChiildEventListener의 이벤트 콜백에는 다음이 있다.

  • onChildAdded()

항목의 목록을 검색하거나 추가가 일어나면 수신 대기한다.

이 콜백은 기존의 하위 요소별로 한 번씩 트리거 되고 이후 지정된 경로에 하위 요소가 새로 추가될 때마다 다시 트리거된다.

리스너에 전달되는 DataSnapshot에 새 하위 데이터가 포함된다.

 

  • onChildChanged()

목록의 항목에 대한 변경사항을 수신 대기한다.

이 이벤트는 하위 노드가 수정될 때마다 트리거되며, 이벤트 리스너에 전달되는 DataSnapshot에 하위 요소의 업데이트된 데이터가 포함된다.

 

  • onChildRemoved()

목록의 항목 삭제를 수신 대기한다.

이벤트 콜백에 전달되는 DataSnapshot에는 삭제된 하위 요소의 데이터가 포함된다.

 

  • onChildMoved()

순서가 지정된 목록의 항목 순서의 변경사항을 수신 대기한다.

하위 요소 재정렬을 야기하는 업데이트로 인해서 onChildChanged() 콜백이 트리거될 때마다 이 이벤트가 트리거된다.

orderByChild나 orderByValue로 정렬된 데이터에 사용된다.

 

틴더 앱에서 새로운 사용자가 발생하거나 기존 사용자의 정보에 변화가 생기면 CardStackView의 Item을 업데이트하기 위해 ChildEventListener을 사용하였다.

private fun getUnSelectedUsers() {
    userDB.addChildEventListener(object: ChildEventListener{
        override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
            if (snapshot.child("userId").value != getCurrentUserId()
                && snapshot.child("likedBy").child("like").hasChild(getCurrentUserId()).not()
                && snapshot.child("likedBy").child("dislike").hasChild(getCurrentUserId()).not()) {

                val userId = snapshot.child("userId").value.toString()
                var name = "undecided"
                if(snapshot.child("name").value != null) {
                    name = snapshot.child("name").value.toString()
                }

                cardItems.add(CardItem(userId, name))
                adapter.submitList(cardItems)
                adapter.notifyDataSetChanged()
            }
        }

        override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {
            cardItems.find { it.userId == snapshot.key }?.let {
                it.name = snapshot.child("name").value.toString()
            }
            adapter.submitList(cardItems)
            adapter.notifyDataSetChanged()
        }

        override fun onChildRemoved(snapshot: DataSnapshot) {}

        override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {}

        override fun onCancelled(error: DatabaseError) {}

    })
}

 

 

 

728x90
반응형

'Android > Side Projects' 카테고리의 다른 글

당근마켓 앱 개발하기  (1) 2022.02.19
Tinder 앱 개발하기  (0) 2022.02.18
Tinder 앱 개발하기  (0) 2022.02.16
Tinder 앱 개발하기  (0) 2022.02.15
도서 리뷰 앱 개발하기  (0) 2022.02.14