Flow 플로우

aram·2023년 3월 21일
0

Flow

Flow는 코루틴을 기반으로 빌드되며 비동기로 계산되는 데이터 스트림이다. 데이터베이스에서 실시간 업데이트를 수신할 수 있다.

리액티브 프로그래밍과 데이터 스트림

리액티브 프로그래밍이란 데이터가 변경될 때 이벤트를 발생시켜 데이터를 계속해서 전달하도록 하는 프로그래밍 방식이다. 리액티브 프로그래밍에는 하나의 데이터를 발행하는 생산자가 있고 그 생산자가 데이터 소비자에게 지속적으로 데이터를 전달하는데, 이 것이 데이터 스트림의 요소이다.

  • 생산자는 스트림에 추가되는 데이터를 생산합니다. 코루틴 덕분에 흐름에서 비동기적으로 데이터가 생산될 수도 있다.
  • (선택사항) 중개자는 스트림에 내보내는 각각의 값이나 스트림 자체를 수정할 수 있다.
  • 소비자는 스트림의 값을 사용한다.

예시

flow 블럭 내에서 emit() 함수를 사용하여 수동으로 데이터 스트림에 값을 내보낸다. (생산자 역할)
생산자는 suspend 함수인 fetchLatestNews() 의 네트워크 요청이 완료될 때까지 정지상태로 유지된다.

class NewsRemoteDataSource(
    private val newsApi: NewsApi,
    private val refreshIntervalMs: Long = 5000
) {
    val latestNews: Flow<List<ArticleHeadline>> = flow {
        while(true) {
            val latestNews = newsApi.fetchLatestNews()
            emit(latestNews) // Emits the result of the request to the flow
            delay(refreshIntervalMs) // Suspends the coroutine for some time
        }
    }
}

// Interface that provides a way to make network requests with suspend functions
interface NewsApi {
    suspend fun fetchLatestNews(): List<ArticleHeadline>
}

데이터 스트림의 모든 값을 가져올 때 collect 를 사용한다.(소비자 역할)
코루틴 내에서 실행하야 하며 collect를 호출하는 코루틴은 데이터 스트림이 종료될 때까지 정지될 수 있다.

class LatestNewsViewModel(
    private val newsRepository: NewsRepository
) : ViewModel() {

    init {
        viewModelScope.launch {
            // Trigger the flow and consume its elements using collect
            newsRepository.favoriteLatestNews.collect { favoriteNews ->
                // Update View with the latest favorite news
            }
        }
    }
}

0개의 댓글