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

2021. 12. 14. 06:03· Coroutines/Flow
목차
  1. collectLatest를 이용한 최신 데이터 collect의 한계점
  2. 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이 수행하는 시간이 오래 걸릴 경우에도 계속해서 최신 데이터를 발행받을 수 있다.

반응형
저작자표시 비영리 변경금지 (새창열림)
  1. collectLatest를 이용한 최신 데이터 collect의 한계점
  2. conflate을 이용해 최신 데이터 collect하기


 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com

'Coroutines/Flow' 카테고리의 다른 글
  • [Coroutine Flow] flatMapLatest 이용해 최신 데이터만 사용해 flow 변환하기
  • [Coroutine Flow] flatMapConcat을 사용해 flow를 다른 flow로 변환하기
  • [Coroutine Flow] buffer 이용해 발행과 소비를 위한 Coroutine 분리하기
  • [Coroutine Flow] collect와 collectLatest의 차이는 무엇인가?
Dev.Cho
Dev.Cho
'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring, CI, CD 분야에 대해 다룹니다.
Dev.Cho
조세영의 Kotlin World
Dev.Cho
전체
오늘
어제

블로그 메뉴

  • LinkedIn
  • GitHub
  • 분류 전체보기 (491)
    • Kotlin (104)
      • Class and Interface (19)
      • Variable and Function (8)
      • Modifier (5)
      • Collection (14)
      • Time (8)
      • 동시성 제어 (7)
      • Reactive Programming (2)
      • Paradigm (2)
      • Kotlin 자료구조 (15)
      • Design Patterns (11)
      • Algorithm (3)
      • Exception (1)
      • 기타 (9)
      • Update History (0)
    • Coroutines (32)
      • Coroutine Basics (18)
      • Flow (9)
      • CoroutineScope (3)
      • Debugging (2)
    • Testing Codes (28)
      • Test 기본 (3)
      • JUnit5 (9)
      • MockK (6)
      • Testing Coroutines (1)
      • Testing Android (8)
      • Test 기타 (1)
    • Spring (50)
      • Dependency Injection (18)
      • Settings (5)
      • REST API (0)
      • DevTools (1)
      • MVC (18)
      • Error (2)
      • MongoDB (2)
      • Database (4)
    • Android (39)
      • Architecture (2)
      • Component (5)
      • Manifest (1)
      • Lifecycle (2)
      • Dependency Injection (17)
      • Resource (1)
      • Storage (1)
      • Security and Optimization (1)
      • WebView (2)
      • Error (6)
    • Android Jetpack Compose (33)
      • Compose (6)
      • Compose Modifier (13)
      • Compose Resource (4)
      • Compose State (4)
      • Compose Side Effect (6)
    • Android Jetpack Compose UI (48)
      • Compose Layout (14)
      • Compose Text (10)
      • Compose Button (5)
      • Compose Dialog (2)
      • Compose TextField (0)
      • Compose UIs (4)
      • Compose Animation (1)
      • Compose Canvas (12)
    • Android Jetpack (10)
      • Datastore (5)
      • ViewModel (4)
      • LiveData (1)
      • Paging (0)
    • KMP (5)
    • Programming (4)
    • Machine (9)
      • JVM (7)
      • Linux (2)
    • CI, CD (74)
      • Gradle (12)
      • Groovy Gradle (5)
      • Git (25)
      • Git Remote (5)
      • GitHub (5)
      • GitHub Actions (21)
    • Network (33)
      • GraphQL (12)
      • HTTP (11)
      • Basic (9)
    • 오픈소스 (3)
    • Database (3)
      • MongoDB (3)
    • IDE (6)
      • Android Studio (2)
      • Intellij (4)
    • Firebase (1)
    • Javascript (9)

공지사항

  • 코틀린 코루틴 완전 정복 강의 in 인프런 오픈
  • 코틀린 코루틴의 정석 책 출간
  • Kotlin Coroutines 공식 기술 문서 한국어 번⋯
  • GitHub에서 조세영의 Kotlin World를 Foll⋯
  • 문의&제안

인기 글

태그

  • compose
  • flow
  • 유닛 테스팅
  • Unit Testing
  • Jetpack Compose
  • HTTP
  • Coroutine
  • dagger2
  • GraphQL
  • java
  • kotlin spring
  • junit
  • Android
  • gradle
  • 스프링
  • Spring
  • 안드로이드
  • junit5
  • github actions
  • Class
  • Dependency Injection
  • Kotlin
  • github
  • 코루틴
  • junit4
  • Spring boot
  • GIT
  • 코틀린
  • 의존성 주입
  • Android Compose

최근 글

반응형
hELLO · Designed By 정상우.v4.3.0
Dev.Cho
[Coroutine Flow] conflate를 이용해 최신 데이터 collect 하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.