안드로이드

[코틀린] Coroutine Flow 개념 정리

이손안나 2022. 10. 6. 22:09
💡 Flow 는 비동기식으로 계산할 수 있는 데이터 스트림으로 여러 값을 순차적으로 내보낼 수 있다.

- 생산자 : 스트림에 추가되는 데이터 생산

- 중개자 : 스트림에 내보내는 값이나 스트림을 수정

- 소비자 : 스트림 값을 사용

 

1. Flow 생성

  • flow {  } 로 생성 가능 
  • 데이터 전달을 위해서 emit() 함수를 사용하고 
  • emitAll() 를 통해 다른 데이터도 방출 가능
  • asFlow()를 이용하면 array, iterator, range등도 flow로 변환 가능.
private fun getNumbers(): Flow<Int> = flow {
    for (i in 1..100) {
        emit(i)
        println("Emit $i") // 1 ~ 100 까지 방출
    }
     emitAll((101 .. 200).asFlow()) // 101 ~ 200 까지 방출
}

 

  • 일반 함수와 suspend 함수도 asFlow를 사용하면 flow로 변환 가능.
fun getStr(): String = "String"
fun getFlowStr(): Flow<String> = ::getStr.asFlow()

suspend fun getSuspendStr(): String = "String"
fun getFlowSuspendStr(): Flow<String> = ::getSuspendStr.asFlow()

2. 데이터 요청

  • 데이터 요청을 위한 함수는 collect, collectIndexed(index 추가로 받음), collectlatest, launchIn 가 있다.
(1..3).asFlow().collect {
    delay(100)
    println("$it")
}

❗️ 에러 발생했을 경우

  • catch 함수로 예외처리 가능 
flowOf(1, 2, "Three", 3)
    .onEach { check(it !is String) { "It is Not Number" } }
    .catch { println(it) }
    .collect {
        println(it)
    }