티스토리 뷰

Point모델 class 및 getPoint() 정의부
getPoint() 호출부

Logcat

@@@@@point2: 0
@@@@@point3: 0
@@@@@point1: 10 (Firestore db속의 수치)

설명

Google Firebase의 Firestore DB를 이용중, docRef.get()을 통해 db속 데이터를 읽긴하였으나, 밖으로 값을 가져와 사용하는 방법에 대한 문제 발생.
('Point'Colletion안의 'email~'Document안의 'point'Field를 읽는중)

위의 로그에서 보이듯, 처음엔 39라인의 point값 할당이 정상적으로 이뤄지지않는줄 알았으나, 알고보니 get()의 비동기 특성상 docRef.get()-; / Log.d-; / return point; 문장들이 get()이 끝나기전에 곧바로 실행되기 때문이었다. (이에 따라 int기본초기화값인 0이 들어갔던것)
(Logcat도 '@@@@@point1-2-3'순으로 실행될거라 잘못생각함)


해결방법

1. Rx (Emitter를 통해 내보내기) << 간단히 언급후 생략

fun getPoint() = Single.create<Point> { emitter ->
        mFirestore.collection(POINTS)
                .document(id)
                .get()
                .addOnCompleteListener {
                    if (it.isSuccessful) {
                        if (it.result != null && it.result.data != null) {
                            emitter.onSuccess(it.result.toObject(Point::class.java)!!)
                        } else {
                            emitter.onError(Exception("Point Not Found - $id"))
                        }
                    } else {
                        emitter.onError(Exception("Point Not Found - $id"))
                    }
                }
    }

2. 콜백(Callback)

Android뿐아니라 Javascript 등 비동기 프로그래밍에서 일반적으로 쓰이는 방법.
정확한 개념 및 이해는 별도 검색을 통해ㄱㄱ
여기선 다음과 같은 과정을 거쳐 문제 해결.

  1. interface 새롭게 정의

    GetPointListener.jaca 파일 생성 및 GetPointListener interface 정의.

  2. getPoint() 정의부 수정

    getPoint() 메서드에 인자로 추가 및 사용

  3. getPoint() 호출부 수정

    1. implements GetPointListener 추가

      public class @@@ implements GetPointListener {
    2. @Override onPointLoaded (default)

    3. getPoint()에 new로 @Override onPointLoaded하며 인자 추가

Logcat

@@@@@point2: 0
@@@@@point3: 0
@@@@@point1: 10
@@@@@point4: 10

  • interface&callback을 거쳐 point4까지 값(10)이 도착한것을 확인
  • 이제 저곳에 원하는 코드를 작성 (do your work here)
  • 본 포스팅 작성후, 필요없는 getPoint(~)의 return형 int->void로 변경

추가

위의 코드는 수정이 덜 끝난 상태라서 변경할부분도 일부 포함되어있다. 이에 주의하자

이런 사용이 깔끔하다. 원리는 이해했으니, 자유롭게 변형하며 사용하면 될듯.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함