Groo

conflate를 활용하여 최신 데이터 collect 본문

프로그래밍 언어/Kotlin

conflate를 활용하여 최신 데이터 collect

김주엽 2022. 4. 3. 16:26

아래 내용은 모두 해당 원글을 기반으로 요약정리한 내용입니다.

그림은 저자가 직접 제작한 것임을 알려드립니다. (출처: Kt World)


데이터의 발행이 소비의 속도보다 빠를 때 collectLatest를 활용하면 중간 데이터는 하나도 얻지 못하고 마지막 데이터만 얻는다.

 

conflate를 활용하면 새로운 데이터가 발행되더라도 이미 시작한 데이터 소비는 끝날 때까지 진행하고 해당 소비가 끝난 시점에서 가장 최신에 발행된 데이터를 기준으로 소비를 이어서 다시 진행한다.

 

val feedbackFlow = flow {
    for (i in 1..50) {
        emit(i)
        delay(1000) // 피드백 생성 소요시간
    }
}

fun reflectFeedback() {
    lifecycleScope.launch {
        feedbackFlow.onEach {
            println("${it}번째 피드백이 전달되었습니다.")
        }.conflate().collect {
            delay(5000) // 피드백 반영 소요시간
            println("${it}번째 피드백을 반영했습니다.")
        }
    }
}

// 1번째 피드백이 전달되었습니다.
// 2번째 피드백이 전달되었습니다.
// 3번째 피드백이 전달되었습니다.
// 4번째 피드백이 전달되었습니다.
// 5번째 피드백이 전달되었습니다.
// 1번째 피드백을 반영했습니다.
// 6번째 피드백이 전달되었습니다.
// 7번째 피드백이 전달되었습니다.
// 8번째 피드백이 전달되었습니다.
// 9번째 피드백이 전달되었습니다.
// 10번째 피드백이 전달되었습니다.
// 5번째 피드백을 반영했습니다.
...

collectLatest는 가장 최신에 발행된 마지막 데이터 하나만을 소비할 수 있지만 conflate는 중간 데이터를 소비할 수 있다.

Flow의 이런 operator들을 문제상황에 맞게 사용하자.


conflate에 대해서 알아봤다.

Flow에는 다양한 operator가 존재한다, 알아야 효율적으로 조합할 수 있다.

개발자는 평생 공부라는 이유를 이제는 알 것 같다 🤯

Comments