Home 5월 10일 Today I Learned
Post
Cancel

5월 10일 Today I Learned

오늘한 일

  • 프로젝트를 진행하였다
  • 블로그 TIL을 작성하였다
  • 1일 1커밋을 하였다

느낌 점

앨런 Swift 문법 마스터 스쿨을 수강하며 배웠던 내용들이 kotlin과 같이 다른 언어에서도 적용되는 걸 몸으로 느끼며 역시 결국엔 프로그래밍 언어는 큰틀은 비슷하기에 하나만 마스터하면 다른 곳에서도 쉽게 적용할 수 있다는 것을 느꼈다

배운 점

Firebase Realtime Database addListenerForSingleValueEvent 함수 비동기

저번에 코딩 보카 1.0을 만들 때도 그랬지만 Firebase Database에서 값을 받아와서 어딘가에 저장하려고 하면 분명 값은 보이는데 저장이 안되서 사용이 안되는 문제를 겪고 있었다 당시 나는 그저 단순 무식하게 Firebase Realtime Database에서 값을 읽어오면 저장은 안되는구나 하고 넘기며 저장이 안된다는 가정하에 코딩을 하였었는데

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
fun readCourse(): String {
    database = Firebase.database.reference
    val myRef = database.child("user").child(FBAuth.getUid())

    var value: String = ""
    myRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            value = snapshot.value as String
        }

        override fun onCancelled(error: DatabaseError) {
            Log.d("오류", error.toString())
        }
    })

    return value
}

fun newUser() {
    database = Firebase.database.reference
    val myRef = database.child("user").child(FBAuth.getUid())
    myRef.child("course").setValue("a")
}

fun newCourse() {
    database = Firebase.database.reference
    val myRef = database.child("user").child(FBAuth.getUid()).child("course")
    val a = readCourse()
    
    myRef.setValue(a+"b")
}

이번에도 오랜만에 해서 그런가 이전에 겪었던 문제에대해 까먹어 뇌가 초기화된 상태로 위와 같은 코드를 작성하고 Firebase Realtime Database에서 값을 읽어왔지만 값이 저장되지 않는다는 걸 깨달았다

하지만 난 과거와 다르게 앨런 Swift 마스터 스쿨을 수강하며 동기, 비동기 함수, 콜백 함수등의 존재에 대해 알게 되었고 Firebase에서 데이터를 읽어오는 함수가 비동기적으로 작동하여 그런게 아닐까 싶어서 kotlin 문법을 찾아본 뒤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
fun readCourse(callback: (String) -> Unit) {
    database = Firebase.database.reference
    val myRef = database.child("user").child(FBAuth.getUid())

    myRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            val value = snapshot.value as String
            callback(value)
        }

        override fun onCancelled(error: DatabaseError) {
            Log.d("오류", error.toString())
        }
    })
}

fun newUser() {
    database = Firebase.database.reference
    val myRef = database.child("user").child(FBAuth.getUid())
    myRef.child("course").setValue("a")
}

fun newCourse() {
    database = Firebase.database.reference
    val myRef = database.child("user").child(FBAuth.getUid()).child("course")
    
    readCourse { a ->
        myRef.setValue(a + "b")
    }
}

위와 같이 readCourse() 메소드를 콜백 함수 내부로 이동시키는 방식으로 코드를 다시 작성하였고 내 생각이 적중하여 문제를 해결할 수 있었다

내일 계획

내일은 코딩 보카 2.0 데이터베이스와 연결을 해야겠다

This post is licensed under CC BY 4.0 by the author.

5월 9일 Today I Learned

5월 11일 Today I Learned