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 |