suspend 로 작업하는 함수 즉 비동기적 함수에서 함수가 끝나면 단일 값만 받게 됩니다.
??? : 난 단일 값만 받아도 상관 없는데 ?
이러시면 오른쪽 위에 x 버튼 눌러서 나가시면 됩니다.
Flow 은 이 비동기적으로 끝나는 함수에서 중간중간 갱신되는 값까지 받을수 있도록 설계된 라이브러리 입니다.
Flow 은 Collect으로 값을 요청하지 않으면 값을 방출 하지 않습니다.
그럼 Flow 와 LiveData은 뭐가 다른가
이정도 인거 같습니다.
Android 에서 MVVM 패턴 을 사용할떄 데이터를 수집할떄 Repository 패턴을 사용합니다 .
다만 Repository 에서 비동기 적으로 data 을 return 을 해야할때 LiveData 을 사용해야 할것입니다.
이떄 공식 문서에서는 LiveData은 Presentation 레이에 보관 되어야 한다 입니다 .
LiveData view에 맞춰서 생명주기가 관리 대기 때문에 Repository에 넘기면 그다음 부터는 생명주기가 어떨지 몰라 잘 구성해야 합니다.
그래서 개발자들이 생각한게
이런식으로 설계하는걸 추천하고 있습니다.
@Dao
interface RoomDatabaseDao() {
~~~
@Query("SELECT * FROM velogData)
fun getVelogPost() : Flow<List<Velog>>
}
RoomDatabase 에 데이터를 가져오는것을 Flow 로 Retrun 해줍니다.
interface VelogRepository {
fun getVelogData() : Flow<List<Velog>>
Repository 의 getVelogData 의 반환 타입을 Flow 로 해줍니다 .
그럼 구현체로 가보겠습니다.
class VelogReposityoryImpl(private val database : RoomDatabas()){
override fun getVelogData() : Flow<List<Velog>> {
return database.RoomDatabaseDao().getVelogPost()
}
이런식으로 Repository 의 구현체에서 return Flow을 해줍니다.
그럼 연결되있는 viewModel 로 가보겟습니다.
class MainViewModel ( ) : ViewModel () {
val velogFlow : Flow<List<velog>> = VelogRepositoryImpl.getVelogData()
자 그럼 view로 가서 Flow로 view을 변경해 봅시다.
class MyVelogPostFragment : Fragment()
override fun onCreateView() {
~~~
}
override fun onViewCreate() {
lifecycleScope.launch {
MaiNViewModel.velogFlow.collectLatest{
Log.d("TAG" , "$it" )
}
이런식으로 사용하면 되겠습니다.