[Android A..Z] Flow onXXX연산자 예외처리 정리

2024. 4. 21. 17:02개발/[Kotlin] 안드로이드 개발

반응형

onEach : 각 아이템 마다 무언가 할 때

fetchBoardDetailItemUseCase(id)
            .onStart {
                _boardDetailUiState.update {
                    it.copy(
                        isLoading = true,
                        items = listOf()
                    )
                }
            }.onEach {
                Log.d(TAG, "Item ${it.toString()}")
            }

Flow에서 아이템을 방출할 때 마다 실행하도록 할 수 있다.

업스트림에서 흘러나오는 값을 그대로 내보낸다.

onStart : 시작할 때

fetchBoardDetailItemUseCase(id)
            .onStart {
                _boardDetailUiState.update {
                    it.copy(
                        isLoading = true,
                        items = listOf()
                    )
                }
            }

onStart 함수는 Flow가 실행을 시작할 때 특정 데이터를 방출할 수 있도록 지원한다.

선언 위치는 사용전이면 상관 없으며 여러 번 사용하면 순서대로 전부 실행된다.

onEmpty : 비어있을 때

fetchBoardDetailItemUseCase(id)
            .onEmpty {
                _boardDetailUiState.update {
                    it.copy(
                        isLoading = false,
                        items = listOf(),
                        errorMessage = "boardDetailUiState is Empty!!"
                    )
                }
            }

onEmpty 함수는 Flow가 비어있을 때 특정 데이터를 방출할 수 있도록 지원한다.

선언 위치는 상관이 없으나 여러 번 사용하면 처음에 사용한 함수만 적용이 된다.

catch : 에러 발생했을 때

fetchBoardDetailItemUseCase(id)
            .onStart {
                _boardDetailUiState.update {
                    it.copy(
                        isLoading = true,
                        items = listOf()
                    )
                }
            }.catch {
                _boardDetailUiState.update {
                    it.copy(errorMessage = "boardDetail is Error!!")
                }
            }

catch 함수는 try / catch와 동일한 역할로 예외 발생 시 해당 예외처리를 위하여 사용할 수 있다.

인자로는 throwable이 들어오며 예외처리 후 Flow는 알아서 종료된다.

catch 함수는 upStream 만 집어낼 수 있기에 사용 위치가 매우 중요하다.

onCompletion: 완료되었을 때

fetchBoardDetailItemUseCase(id)
            .onStart {
                _boardDetailUiState.update {
                    it.copy(
                        isLoading = true,
                        items = listOf()
                    )
                }
            }.onCompletion {
                Log.d(TAG, "complete")
            }

onCompletion 함수는 try/finally와 동일한 역할로 Flow가 완료되었을 때의 동작을 지정할 수 있다.

 

정상적인 완료와 에러로 인한 와료 두 가지 케이스 모두 해당 함수를 실행시킨다.

인자로는 Throwable이 들어오며, null 이면 정상종료 또는 catch를 통해 이미 예외 처리된 경우이고 null이 아니면 에러로 인한 종료이다.

 

반응형