Flow란?
코틀린의 플로우는 순차적으로 값을 내보내고 정삭적으로 또는 예외로 완료되는 비동기적 데이터 스트림이다.
map, filter, take, zip 등과 같은 flow의 중간 연산자는 업스트림 flow나 flow에 적용되어 추가 연산자를 적용할 수 있는 다운 스트림 flow를 반환하는 함수다.
위 중간 연산자는 flow에서 코드를 실행하지 않고 함수 자체를 일시 중단하지 않는다. 단지 향후 실행과 신속한
복귀를 위해 일련의 작업을 설정한다.
이를 cold flow라고 부른다.
flow의 터미널 연산자는 collect, single, reduce, toList 등과 같은 일시 중단 함수이거나 지정된 스코프에서
flow 수집을 시작하는 launchIn 연산자이다. 이는 업스트림 flow에 적용되며 모든 작업의 실행을 트리거한다.
터미널 연산자는 업스트림에서 모든 flow 작업의 성공 또는 실패에 따라 정상적으로 또는 예외적으로 완료된다.
가장 기본적인 터미널 연산자는 collect로 아래와 같다.
try {
flow.collect { value ->
println("Received $value")
}
}catch (e: Exception){
println("The flow has thrown an exception : $e")
}
기본적으로 flow는 순차적이고 모든 flow 작업은 동일한 코루틴에서 순차적으로 실행된다
단, buffer 및 flatMapMerge와 같은 특별히 설계된 몇 가지 작업은 예외다.
Flow builders (Flow 만들기)
- flowOf(..) 함수를 사용하여 고정된 값 집합에서 flow를 만든다.
- 다양한 타입에 대한 asFlow() 확장 함수를 사용하여 flow로 변환한다.
- flow {..} 빌더 함수로 순차적 호출에서 emit 함수로 임의의 flow를 구성한다.
- channelFlow {..} 빌더 함수를 통해 잠재적으로 동시 호출해서 send 함수로의 임의의 flow를 구성한다.
- MutableStateFlow 및 MutableSharedFlow는 해당 생성자 함수를 정의하여 직접 업데이트할 수 있는 Hot Flow를 만든다.
간단한 사용 예
참고 예제 - https://developer.android.com/codelabs/advanced-kotlin-coroutines?hl=ko#0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
GlobalScope.launch {
getNumbers()
.catch { exception -> showMsg("error", exception.message.toString()) }
.collect { reponse ->
for (data in reponse.manInfo) {
showMsg(data.age.toString(), data.name)
}
}
}
}
private fun showMsg(age: String, name: String) {
Log.e("## $age , ", name)
}
/**
* api 응답값을 가져와 스트림을 만듦
*/
private fun getNumbers(): Flow<Response> = flow {
val response = makeDummy()
emit(response)
}
/**
* remote storage 에서 받은 데이터라고 가정
* Repository로 관리해야하는 부분.
* 일단 간편하게 작성.
*/
private fun makeDummy(): Response {
val data = ArrayList<ManInfo>()
for (i in 0 until 10) {
data.add(ManInfo(i, "tester $i"))
}
return Response(200, data)
}
'Kotlin' 카테고리의 다른 글
[Kotlin] Coroutine 동기화 처리 (0) | 2021.12.21 |
---|---|
[Kotlin] inline 함수 (0) | 2021.09.06 |
[Kotlin] 리스트를 통한 명령형 방식과 함수형 방식 비교 (0) | 2021.08.04 |
[Kotlin] 커링(Currying) 함수 (0) | 2021.08.03 |
[Kotlin] Tailrec (0) | 2021.08.02 |