ํ๋ฅด๋ค / ์ด๋ค ์ผ์ด ์งํ์ด๋๋ค / ๋ถ์๊ธฐ๋ฅผ ํ๋ค ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
์ฐ๋ฆฌ๋ ๊ทธ์ค์ "๋ฐ์ดํฐ์ ์ผ์ด ์งํ" ๋๋ ๊ณผ์ ์ธ Coroutine Flow๋ฅผ ์์๋ณด์
"Coroutine Flow๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น์ (User) ์๊ฒ ๋ฐ์ดํฐ๊ฐ ํ๋ฅธ๋ค...."
์ฝ๊ฒ ๋งํ๋ฉด Flow๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
ํด๋ฆฐ ์ํคํ ์ณ๋ก ์ฑ์ ๋ง๋ค์์ Data Layer๋ถ๋ถ์์ Repostiroy ๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ค์ ๊ฐ์ ธ์ค๊ฒ๋๋ค . ๋ฐ์ ๊ทธ๋ฆผ์ ๋ณด์
โ๏ธ ํ์ง๋ง ์ด๋ ๊ฒ ์ฌ์ฉ๋งํ๋ค๋ฉด ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ฐ์์ฌ ์ ์๋ค.
๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ ๋ ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ์ ๋ฌํ๋ ๋ฐฉ์
Flow์์ flow{} ๋ธ๋ก ๋ด๋ถ์์ emit() ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค.
userMessageDataSource์์ ์์๋ก ์ฑ์์จ ๋ฉ์ธ์ง๋ฅผ ํ์ธํ๋ค๋ฉด?!
class UserMessagesDataSource(
private val newsApi: NewsApi,
private val refreshIntervalMs: Long = 5000
) {
val latestNews: Flow<List<ArticleHeadline>> = flow {
while(true) {
val latestNews = newsApi.fetchLatestNews()
emit(latestNews)
delay(refreshIntervalMs)
}
}
}
์์ฐ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉด ์ค๊ฐ ์ฐ์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ /๊ฐ๊ณต/์์ธ ์ฒ๋ฆฌํ๋ค.
์์ฐ์(newsRemoteDataSource)์์ ๋ง๋ (lateNews)๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์
favorite topics ํํฐํด์ ๊ฐ์ ธ์จ๋ค์ ๊ฐ๊ฐ(onEach) ์ต์ ๋ด์ค
class NewsRepository(
private val newsRemoteDataSource: NewsRemoteDataSource,
private val userData: UserData
) {
val favoriteLatestNews: Flow<List<ArticleHeadline>> =
newsRemoteDataSource.latestNews
.map { it -> it.filter { userData.isFavoriteTopic(it)}
.catch{ e ->
log.d("Error Loading reserved event")
}
}
Collect๋ฅผ ์ด์ฉํด ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์๋นํฉ๋๋ค.
class LatestNewsViewModel(
private val newsRepository: NewsRepository
) : ViewModel() {
init {
viewModelScope.launch {
newsRepository.favoriteLatestNews.collect { favoriteNews ->
//
}
}
}
์ฌ๊ธฐ๊น์ง๋ ๊ธฐ์ด์ ์ธ Flow์ ๋ํด์ ์ดํด ๋ณด์๊ณ ๋ค์ํธ์๋ Flow์ ๋ํ ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก ์ดํด๋ณผ ๊ฒ์ด๋ค