본문 바로가기
Android 개발/Coroutine , Flow, Channel

MutableStateFlow 이용한 로딩 후 로딩 완료 기다리기 구현 방법

by Developer88 2023. 4. 8.
반응형

AdView처럼 라이브러리에 로딩을 시키고,

해당 로딩이 다 될 때까지 기다릴 때 어떻게 구현해야 하는지 정리해 보겠습니다.

 

1. Mode 설정

먼저 여러가지 모드를 설정하기 위해서 다음과 같이 Mode에 관한  sealed class를 하나 작성해 줍니다.

이것은 로딩에서 로드가 완료되었을 때를 알기 위해서 인데요.

광고라이브러리에서는 보통 콜백으로 로드가 다 되었을 때 호출되는 onAdLoaded 와 같은 함수를 제공해 주므로,

이러한 콜백함수에서 Mode를 Loaded로 해주고,

로딩을 시작할 때, Loading으로 모드를 설정해 주면 되겠지요.

 

sealed class AdMode {
    object Loading : AdMode()
    object Loaded : AdMode()
    data class Error(val message: String) : AdMode()
}

 

 

이제 MutableStateFlow를 이용할 차례입니다.

참고로 StateFlow에 대해서는 아래 글을 참조해 주세요.

>> StateFlow 정리 # Android Kotlin Coroutine getStateFlow StateIn

 

val adMode = MutableStateFlow<AdMode>(AdMode.Loading)

 

2. 기다리기 구현

Coroutine의 suspend 함수를 사용하면 되는데요.

먼저 viewModel에 다음과 같은 함수를 만들어 줍니다.

first의 predicate 즉, 조건을 만족하는 것이 나올 때까지 기다리도록 하는 것이 핵심입니다.

 

suspend fun waitForAdLoading() {
    adMode.first { it !is AdMode.Loading }
}

 

3. Coroutine에서 실행하기

이제 위에서 만든 StateFlow와 suspend 함수를 이용해서 Coroutine에서 실행해주기만 하면 되는데요.

아래와 같이 Coroutine에서 waitForAdLoading()을 실행시킨 후,

결과 값이 나오게 되면,

AdMode.value에 따라서 코드를 구현해 주기만 하면 됩니다.

 

lifecycleScope.launch {
    quizViewModel.waitForAdLoading()
    when (val mode = quizViewModel.AdMode.value) {
        is AdMode.Loaded -> {
            //로딩완료시 구현할 코드
        }
        is AdMode.Error -> {
            //에러시 구현할 코드
        }
        else -> { }
    }
}

 

이상으로 MutableStateFlow를 이용해서 로딩 후 로딩완료를 기다리는 방법에 대해서 정리해 보았습니다.

 

728x90

댓글