Flow๋ ๋ฐ์ดํฐ์ ํ๋ฆ๋ง ๋ฐ์ํ๋ฉฐ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก ์ ์ฅ๋์ง ์๋๋ค
๋ง์ฝ ์ฌ์ฉ์๊ฐ ํ ํ๋ฉด์ ๊ฐ๋ค๊ฐ ๋ค์ ์ฑ์ ๋ค์ด์จ๋ค๋ฉด ๋ฐ์ดํฐ๋ ์ด๊ธฐํ๋๋ค
์ด๋ ๊ฒ ๋๋ฉด ์ฌ์ฉ์๋ ๋ดค๋ ์น์
์ธ๋ฑ์ค๊น์ง ๋ค์ ์ฐพ์๊ฐ์ผ ํ๋ค๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธด๋ค
flow์ collectํ ๋ฐ์ดํฐ๋ฅผ viewModel์ ์ ์ฅํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์์ผ๋ ค๋ฉด ๋ณ๋์ ๋ฐ์ดํฐ ํ๋ ๋ณ์๋ฅผ ๋ง๋ค์ด์ผํ๋ฉฐ, ์ด๋ฌํ ๋ณ์๋ Reactive ํ์ง ์๊ธฐ ๋๋ฌธ์ UI์์ ๋ฐ๋ก Fetching ๋ก์ง์ ๋ง๋ค์ด์ผํ๋ค.
โ๏ธ Cold Flowโ๏ธ โ๏ธ
๋ฐ์ดํฐ ํ๋(์ ์ฅ์) ์ญํ ์ ํ๋ฉด์ Flow์ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ญํ ์ ํ๋ค
์ฆ, ์ฌ๋ฌ๊ฐ์ flow์ ๋ฐ์ดํฐ ํ๋(์ ์ฅ์) ์ญํ ์ ํ๋ฉฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ญํ ๊น์ง ํฉ๋๋ค
๋ฐ์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด
stateIn์ ์ฌ์ฉํด์ ๋ณํํ ์ ์๋ค.
class MyViewModel(...) : ViewModel() {
val result: StateFlow<Result<UiState>> = flow {
emit(repository.fetchItem())
}.stateIn(
scope = viewModelScope,
started = WhileSubscribed(5000),
initialValue = Result.Loading
)
}
๋ฐ์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๋๊ฐ์ง๊ฐ ๋๋ ์ ธ ์๋ค
์ฌ์ฉ์๊ฐ ๋ค์ ์ฑ์ ์ผฐ์๋ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ ค๋ฉด ๋ค์ Flow๋ฅผ ์ฌ์์ํด์๋ ์๋๋ค.
์ด๊ฒ์ ์๊ธฐ ์ํด์ ์๊ฐ์ด๊ณผ(WhileSubscribed)๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ ์๊ฐ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ๋์ํ๋๊ฒ์ ์์๋ณด์๋ค.