본문 바로가기
Android

Flow 개념

by Diane_KIM 2023. 8. 30.

Flow란?

coroutine에서 suspend함수는 단일값만 출력하는데 반응형 프로그램을 개발하다보면 데이터를 순차적으로 받아야할 경우가 있음.

이 때 flow를 통해서 데이터를 받아서 데이터 흐름을 만드는것.

  • 생산자 : 데이터를 생산합니다. 서버와의 통신을 통해 데이터를 가져온것 
  • 중개자 : 데이터를 가공, 수정합니다. map함수등을 사용해 데이터를 필요에 맞게 변경
  • 소비자 : 데이터를 사용합니다. 데이터를 사용하는 viewModel, view 등

 

Flow 생성하기(생산자)

class Datasource {
   suspend fun fetchData(): Flow<String> {
      return flow { // flowBuilder
        for(value in 0..3) {
           delay(1000)
           emit(value.toString()) //데이터 방출(생산)
        }
      }
    }
}

0부터 3까지의 데이터를 1초간격으로 생산하는 함수. flow빌더를 통해 흐름을 만들고, emit함수를 통해 데이터를 생산한다.

 

*flow빌더에서 다른 coroutineContext의 값을 생산(emit)할 수 없습니다. 그러므로 새 코루틴을 만들거나 withConext블록을 사용하여 다른 coroutineConext에서 emit을 호출하면 안됩니다. (꼭 필요하다면 flowOn연산자 사용)

val dataSource = flow{
   for(count in 0..3){
     val result = fetchData() // fetchData가 return 된 후 다음 코드가 실행됩니다.
     emit(result+" return")
   }
}
 
suspend fun fetchData(): String {
    delay(1000)
    return "data"
}

 

Flow 수정하기(중개자)

datasource.map{ data-> data + "!" }

flow는 map함수를 통해 수정할 수 있다.

 

 

Flow 수집하기(소비자)

flow는 터미널 연산자(collect, single, reduce, toList)를 통해 수집됩니다.

  • collect : 모든 데이터를 수집
  • single : 단일 데이터 하나만 수집
  • first : 맨 처음에 생성된 단일 데이터를 수집
  • toList & toSet : 생성된 데이터들을 mutable collection으로 수집
  • fold : 생성된 데이터들을 주어진 연산을 이용해 최종 결과를 수집
  • collectIndexed : collect와 같은 연산이지만 index를 추가로 수집

'Android' 카테고리의 다른 글

안드로이드에서 dp란?  (0) 2023.11.23
[깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 코틀린  (0) 2023.11.21
코루틴  (0) 2023.08.30
Glide  (0) 2023.08.30
Case of Fragment Memory Leak  (2) 2023.08.30