- flatMapConcat
flatMapConcat 은 flow 간의 연결이 필요할 때 사용하는 연산자 입니다.
아래에서 예시를 들어보겠습니다.
먼저 클린 아키텍처 구조에 viewModel 에서 api 를 호출하는 경우라고 생각하겠습니다.
서버로부터 token을 가져와서 token을 실어서 다른 api 를 호출하는 경우라고 생각해보겠습니다.
그렇다면,
1. token 을 가져오는 api 하나
2. token 을 실어서 호출하는 api 하나
이렇게 두가지의 데이터 스트림을 형성해야 합니다.
즉 , flow 가 두개가 필요하고 이 flow들을 순서대로 연결하기 위해 flatMapConcat을 사용해보겠습니다.
@Test
fun `FlatMapConcat 테스트`() = runTest {
/** 서버로부터 token 을 가져오는 flow */
val flow1 = flow<String> { emit("token") }
/** flow1 으로부터 token 을 받아서 새로운 flow 에 넣어준다. */
val flow2 = flow1.flatMapConcat { token ->
flow {
emit("$token result")
}
}
/** 새로운 flow 로부터 collect을 통해 데이터를 소비한다. */
flow2.collectLatest {
println(it)
}
}
flow1 : 서버로부터 token을 가져오는 데이터 스트림
flow2 : flow1으로부터 받아온 token을 싣는 새로운 데이터 스트림 (위에선 예제로 token을 그대로 emit에 넣었습니다. 전달받은 token이 잘 출력되는지 보기위해서 말입니다. 실제 구현이었다면 Usecase(token = token) 에 실어서 api를 호출하여 response 데이터를 flow에 emit 했을 것입니다.)
collectLatest 를 통해 출력한 결과는
잘 나왔습니다. 위에서는 flow를 블럭별로 변수를 나누어 본것이며 나눌 필요 없이
@Test
fun `FlatMapConcat 테스트`() = runTest {
flow<String> {
emit("token")
}.flatMapConcat { token ->
flow {
emit("$token result")
}
}.collectLatest {
println(it)
}
}
}
붙여서 호출을 해도 잘 작동합니다.
하지만! flatMapConcat 에도 주의해야 할점이 있습니다.
새로운 flow를 생성하는데 시간이 오래걸린다면 처음 flow를 생성하는 시점은 빠른데 새로운 flow를 생성하고 발행하는데 느려서 첫 데이터 생성과 최종적으로 소비하는 시점의 시간 차가 많이 발생하게 됩니다.
배압 처리의 문제가 발생할 수 있다고 생각하시면 될거 같습니다.
그래서 collectLatest 처럼 flatMapLatest 를 다음글에서 알아보겠습니다.
'안드로이드 > Flow' 카테고리의 다른 글
[android/안드로이드] Flow 란? (0) | 2022.08.02 |
---|---|
[android/안드로이드] LiveData VS StateFlow (0) | 2022.07.27 |