firebase with coroutines
문제 상황
firebase를 이용하다가 보면 라이브러리에서 제공하는 대부분의 메서드는 listener를 통해 비동기로 응답을 보내주고, 그 응답을 가공하여 사용해야 하는 경우가 많다
예를 들어
fun subscribeWalkingDistanceData(successCallback : () -> Unit, failureCallback : () -> Unit){
Fitness.getRecordingClient(GlobalApplication.getApplicationContext(),mGoogleSignInAccount).subscribe(DataType.TYPE_DISTANCE_DELTA)
.addOnSuccessListener{
Log.d(TAG,"successfully subscribe distance delta")
successCallback()
}.addOnFailureListener{
Log.e(TAG,"there was a problem subscribing walking distance data${it.localizedMessage}")
failureCallback()
}
}
위와 같이 유저가 이동한 거리에 대한 데이터를 subscribe를 하기 위해 다음과 같은 메서드를 작성했다면, 각각 성공 실패 리스너를 통해 firebase가 어떤 응답을 주는가에 따라서 매개변수로 받은 콜백함수를 실행시키는 형태로 코드를 작성 할 수 있다.
그런데 이렇게 코드를 작성하다 보면 콜백지옥의 문제가 생긴다.
depth가 하나일 때는 무난하게 callback함수를 매개변수로 넘겨 실행 시켜도 문제가 없지만
depth가 깊어질 수록 매개변수로 콜백을 계속 물고 들어가기 때문에 점점 복잡해지는 문제가 생긴다.
사실 이전에는 콜백으로 처리하였는데, 이번에 MVP패턴을 적용하면서 함수를 단순한 기능의 형태로 쪼개다보니 파이어베이스에서 받아온 응답 데이터를 그대로 return 해줘야 하는 함수들을 만들기 시작했고, 이에 다른 방법을 찾아보게 되었다.
해결 방법
구글링 결과 이를 해결하기 위해서 파이어베이스 메서드를 비동기처리하는 라이브러리를 추가하면 된다는 사실을 알게되었다.
- 모듈 수준 gradle에 dependency를 추가해주자
implementation **'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.2'**
- 현재기준 1.6.2가 가장 최신 버전이다.
- dependency를 추가한 후 firebase에서 제공하는 라이브러리 안의 함수를 호출할 때 .await()를 사용할 수 있게 되어 응답이 올 때 까지 대기 할 수 있게 된다.
- 코드를 바꿔보자.
/*하루동안 걸은 거리 관련 함수 */
//피트니스 데이터(걸은 거리)
suspend fun subscribeWalkingDistanceData(){
Fitness.getRecordingClient(GlobalApplication.getApplicationContext(),mGoogleSignInAccount).subscribe(DataType.TYPE_DISTANCE_DELTA)
.addOnSuccessListener{
}.addOnFailureListener{
}
val response = Fitness.getRecordingClient(GlobalApplication.getApplicationContext(),mGoogleSignInAccount)
.subscribe(DataType.TYPE_DISTANCE_DELTA).await()
}
위처럼 리스너에 콜백 함수를 지정하는 방식에서 밑에 await를 통해 응답이 올때까지 대기 한 후 response라는 변수에 응답으로 온 데이터를 할당하는 방식으로 바꿀 수 있다.
'안드로이드' 카테고리의 다른 글
[Android] google fit api로 걸음 수 데이터 가져오기 (0) | 2022.06.14 |
---|---|
[Android] Chronometer를 이용한 스톱워치 구현 (0) | 2022.06.08 |
[Android] 안드로이드 이동 경로 추적 (1) (0) | 2022.05.31 |
[안드로이드] 코루틴 기초 (0) | 2022.04.11 |
[Kotlin] 고차함수와 람다식에 대하여 (0) | 2022.01.04 |