paging3 라이브러리를 적용하면서 발생한 실수 ㅜ 

 

[문제가 된 코드]

lifecycleScope.launch {        
    viewModel.topicFlow.collectLatest {
        topicAdapter.submitData(it)
    }
            
    viewModel.photoFlow(TopicData.TOPIC_IDX_ALL).collectLatest {
        val isFirst = photoAdapter.itemCount == 0
        photoAdapter.submitData(it)
        if(isFirst){
            checkEmpty()
        }
    }
}

[현상]

viewModel.photoFlow().. 부분이 동작하지 않았음.

 

[이유]

스택오버플로우 

You will need different coroutines, since collect() is a suspending function that suspends until your Flow terminates.

 

아래는 단톡방에서 말씀해주신 이유들..

야옹이님 : 계속 수집하기때문에 Blocking되서 아래것이 실행안되는게 아닐까요

이상해씨님 : collect가 suspend function이라서 코루틴 빌더 안에 있어야해요. collect가 suspend function인데 flow가 끝이 없다면 suspend가 끝나지 않겠죠

Rokace님 : Stateflow는 lifecyclescope에 기반하여 데이터의변화를 관측하는 무한루프 쓰레드 하나를 만듭니다.
Stateflow 하나당 쓰레드 하나죠
그래서 collect는 destroy이전까지 동작합니다.

 

 

[개선한 코드]

lifecycleScope.launch {
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
                launch {
                    viewModel.topicFlow.collectLatest {
                        topicAdapter.submitData(it)
                    }
                }

                launch {
                    viewModel.photoFlow(TopicData.TOPIC_IDX_ALL).collectLatest {
                        val isFirst = photoAdapter.itemCount == 0
                        photoAdapter.submitData(it)
                        if(isFirst){
                            checkEmpty()
                        }
                    }
                }
            }
        }

별도의 코루틴으로 launch 해 주었다.

+ Recent posts