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
}
}
}
}