Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Flow 느껴보기

Flow 느껴보기

- KotlinConf'23 Global in SongDo 발표 자료 입니다.
- 2023년 5월 13일

DavidKwon7

May 13, 2023
Tweet

More Decks by DavidKwon7

Other Decks in Programming

Transcript

  1. 목차 1. Coroutine Flow 소개 2. Flow Operator 3. StateFlow

    / SharedFlow (kotlinConf recap) 4. Flow with compose (kotlinConf recap)
  2. Coroutine Flow 소개 비동기적으로 처리되는 데이터 스트림 생성 및 처리

    앱의 반응성 유지 데이터를 생산 (emit)하는 오퍼레이터와 소비(collect) 하는 오퍼레이터 비동기 코드를 동기적인 코드처럼 작성할 수 있다 데이터를 비동기적으로 처리하고 UI를 업데이트 하는 등의 활용 오퍼레이터를 연결하여 데이터 파이프라인 생성
  3. Coroutine Flow 소개 안드로이드 공식문서에서는 flow를 ‘여러 값을 순차적으로 내보낼

    수 있는 유형’ 이라고 소개하고 있습니다. - 생산자 : 스트림에 추가되는 데이터 생산 - 중개자(선택사항) : 값이나 스트림 자체 수정 - 소비자 : 스트림 사용
  4. Coroutine Flow 소개 Flow는 비동기적으로 처리되는 스트림 형태의 데이터로 ‘생산자

    / 중개자 / 소비자’ 의 형태로 파이프 라인을 형성하여 효율적으로 데이터 처리 및 반응형 UI를 생성할 수 있다.
  5. Operator of Flow - merge merge를 사용하여, 2개 이상의 스트림을

    하나의 스트림으로 합쳐줄 수 있습니다. 2개의 스트림이 나누어진 상태에서 합쳐지는 것이 아닌, 시간의 흐름에 따라 정렬되는 형식을 취합니다.
  6. Operator of Flow - merge suspend fun main() { val

    ints: Flow<Int> = flowOf(1, 2, 3).onEach { delay(100) } val doubles: Flow<Double> = flowOf(0.1, 0.2, 0.3).onEach { delay(50) } val together: Flow<Number> = merge(ints, doubles) print(together.toList()) }
  7. Operator of Flow - combine combine을 사용함으로써 2가지 이상의 flow

    간의 결합이 가능해지기 때문에, 2가지 이상의 데이터를 효과적으로 처리해줄 수 있습니다.
  8. Operator of Flow - combine combine @JvmName(name = "flowCombine") fun

    <T1, T2, R> Flow<T1>.combine (flow: Flow<T2>, transform : suspend (T1, T2) -> R): Flow<R> val flow = flowOf(1, 2).onEach { delay(10) } val flow2 = flowOf("a", "b", "c").onEach { delay(15) } flow.combine(flow2) { i, s -> i.toString() + s }.collect { println(it) // Will print "1a 2a 2b 2c" }
  9. Operator of Flow - zip zip은 combine과 유사한 operator입니다. 차이점은

    결합을 하게 되는 경우 발행하는 이벤트의 횟수가 동일하게 맞춰진다는 특징이 존재합니다.
  10. Operator of Flow - reduce reduce의 프로퍼티는 accumulator, value 가

    존재합니다. accumulate는 누적된 값을 보여주고, value는 이후에 연산이 진행될 값을 보여줍니다.
  11. Operator of Flow - fold fold는 reduce와 유사한 기능을 가지고

    있습니다. 동일하게 accumulate, value를 사용합니다. 차이점은 fold의 경우 fold의 파라미터에 처음 연산 값을 넣어줄 수 있다는 것입니다.
  12. Operator of Flow - scan scan은 fold와 유사하게 결과값을 누적해주는

    기능이 있지만, 리스트 형태로 중간 결과값을 모두 가지고 있다는 특징이 있습니다.
  13. Operator of Flow - buffer buffer를 사용함으로써 기존의 발행/소비 패턴과

    다르게, 데이터 abc 발행 후 데이터 abc 소비하는 형태로 flow를 변경해줄 수 있습니다.
  14. Operator of Flow - map / filter map을 통해 데이터를

    변환할 수 있습니다. filter를 사용하면 조건에 맞는 데이터만 넘겨줄 수 있습니다.
  15. SharedFlow / StateFlow SharedFlow - 수집(collect)하는 모든 소비자에게 값을 보내줄

    수 있다. - 처음 값 구독 시작했을 때는 처음 방출 데이터를 갖지 못한다. - 같은 값을 연속적으로 방출하게 되는 경우 두 값 모두 collect한다.
  16. SharedFlow / StateFlow StateFlow - 현재 상태와 새로운 상태 업데이트를

    수집기(collector)에 내보내는 역할을 수행할 수 있다. - 처음 구독 시작 시, 처음 방출 데이터를 갖는다. - 같은 값을 연속적으로 방출하게 되는 경우 처음 값만 collect한다.
  17. Flow / SharedFlow / StateFlow Cold Flow : collector가 방출된

    데이터를 수집할 때마다 새로운 데이터 스트림 생성하므로 collector들은 각각의 개별적인 데이터 스트림에서 데이터 수집합니다. Hot Flow : collector들이 데이터 스트림을 공유하여 동일한 데이터를 수집하며, 기본적으로 collector가 없어도 데이터 방출합니다. 다수의 구독자가 동일한 스트림을 전달받을 수 있습니다.
  18. collectAsState Compose는 value의 변화를 자체적으로 파악하지 못 합니다. 그렇기에 새로운

    flow 값의 방출이 일어날 때마다, compose state 형태로 값의 변화를 업데이트를 해준다.
  19. collectAsState는 lifeCycle에 종속되지 않는다는 장점이 있습니다. 그렇기에 Android 앱이 백그라운드에

    있는 동안 recomposition을 중지하더라도, 계속해서 작업을 진행할 수 있기에, 백그라운드 상태에서도 작업을 진행할 수 있습니다.