Coroutines/Flow

[Coroutine Flow] conflate를 이용해 최신 데이터 collect 하기

반응형

collectLatest를 이용한 최신 데이터 collect의 한계점

그림1과 같이 데이터 발행 시간 사이의 간격보다 데이터를 처리하는 suspend fun이 수행하는 시간이 오래 걸릴 경우, 새로 들어온 데이터는 계속해서 소비되지 못한다. 즉 이런 상황에서 collectLatest를 쓸 경우 중간 데이터를 하나도 얻지 못하고 마지막 데이터만을 얻을 수 있다.

 

그림1. collectLatest의 한계

 

 

예를 들어 아래 그림2와 같이 데이터 발행에 0.1초가 걸리는데 데이터 소비에 1초가 걸릴 경우 하나도 소비가 안되고 마지막 데이터만이 소비된다.

 

그림2. collectLatest 한계 예시

 

 

conflate을 이용해 최신 데이터 collect하기

이를 해결하는 방법은 간단하다. 한 번 시작된 데이터 소비는 끝날 때까지 하고 데이터 소비가 끝난 시점에서의 가장 최신 데이터를 다시 소비하는 것이다.

 

그림3. conflate의 동작

 

conflate은 그림3의 동작이 collect에서 일어나도록 한다. collect시 conflate을 사용하면 한 번 시작한 suspend fun(데이터 소비)는 취소되지 않고 끝까지 수행되며, 데이터 소비 완료 시점에서 가장 최신 데이터가 다시 소비된다.

 

아래의 코드는 3초마다 0~10의 숫자가 순차적으로 발행되고, 발행된 숫자를 5초마다 소비하는 suspend fun 이 있는 코드이다. 우리는 이 코드에서 collect 시 conflate을 사용하여 최신 데이터가 어떻게 소비되는지 살펴볼 것이다.

 

그림4. conflate 예시

 

이 코드를 실행하면 0이 발행되고 3초후에 1이 발행되고 6초후에 2가 발행되고 9초후에 3이 발행된다. 이 코드는 다음과 같이 실행된다.

 

1. 0이 발행(emit)되고 나서 0에 대한 소모(consume)가 5초 후에 끝난다.

2. 5초 시점에서 마지막 발행된 데이터인 1이 다음 데이터로 소모(consume)된다.

3. 1에 대한 소모(consume)는 시작 시점으로부터 10초후에 끝난다.

4. 10초에서의 마지막 발행 데이터인 3이 소모(consume)된다.

 

즉, 중간에 2가 소모되지 않고 건너뛰어지는 것을 볼 수 있다. 이 방식을 활용하면 데이터 발행 시간 사이의 간격보다 데이터를 처리하는 suspend fun이 수행하는 시간이 오래 걸릴 경우에도 계속해서 최신 데이터를 발행받을 수 있다.

반응형

 

이 글의 저작권은 Kotlin World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.