개요
얼마전 안드로이드 개발 중 대략 난감한 상황에 처했다.
상황은 이러하다. 뷰모델에서 서버 api로 데이터를 받아오는 usecase를 실행시켜 값을 받아오는 간단한 함수를 작성 중 이였다.
코루틴 스코프에서 flow를 실행 시키기위해서
viewModelScope.launch{ flow.onEach { ... } }
와 같은 코드를 작성하였다.
음 아무런 문제가 없어보인다. flow가 발행하는 하나하나 소비할 것이라고 생각했다.
하지만 이게 왠걸..
반환되는 데이터가 전부 null 값이지 않은가..
해결
그렇게 한참을 헤매다 해결책을 찾았다.
내가 쓴 코드의 단축어와 같은 Flow.launchIn(Scope) 를 사용하니 정상적으로 돌아가는 것이 아닌가...
WHY?
이유는 간단했다.
소비한다고 생각했던 onEach는 flow의 중간 연산자, 즉 맵퍼와 같은 역할을 가진 연산자였고 나는 terminal operation (collect, single, reduce) 등등을 사용하지 않은 것이다.
종료 연산자가 없으니 flow 자체가 시작되지 않은 것이였다.
나와 같은 멍청이가 이 글을 보고 도움이 되었으면 한다.
참고
https://handstandsam.com/2021/02/19/the-best-way-to-collect-a-flow-in-kotlin-launchin/
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/
'Android > Issue Handling' 카테고리의 다른 글
순서보장 비동기 작업에 대한 고찰 (1) | 2024.07.24 |
---|