ViewModel에서 LiveData 관찰
데이터 가져 오기 (특히 Firebase)를 처리하는 별도의 클래스가 있으며 일반적으로 여기에서 LiveData 개체를 반환하고 비동기 적으로 업데이트합니다. 이제 반환 된 데이터를 ViewModel에 저장하고 싶지만 문제는 해당 값을 얻으려면 데이터 가져 오기 클래스에서 반환 된 LiveData 개체를 관찰해야한다는 것입니다. 관찰 메서드에는 첫 번째 매개 변수로 LifecycleOwner 개체가 필요했지만 분명히 ViewModel 내부에 해당 개체가 없으며 ViewModel 내부의 Activity / Fragment에 대한 참조를 유지해서는 안된다는 것을 알고 있습니다. 어떻게해야합니까?
에서 이 블로그 게시물 구글 개발자 호세 Alcérreca하여이 경우 변환을 사용 (단락 "저장소에 LiveData"을 참조)하는 것이 좋습니다.
에서 의 ViewModel의 문서
그러나 ViewModel 개체는 LiveData 개체와 같은 수명주기 인식 관찰 가능 항목의 변경 사항을 관찰해서는 안됩니다.
또 다른 방법은 데이터가 LiveData가 아닌 RxJava를 구현하는 것입니다. 그러면 수명주기를 인식하는 이점이 없습니다.
todo-mvvm-live-kotlin 의 Google 샘플에서는 ViewModel에서 LiveData 없이 콜백을 사용합니다.
라이프 사이클웨어라는 전체 아이디어를 준수하려면 Activity / Fragment에서 관찰 코드를 이동해야합니다. 그렇지 않으면 ViewModel에서 콜백 또는 RxJava를 사용할 수 있습니다.
또 다른 절충안은 MediatorLiveData (또는 Transformations)를 구현하고 ViewModel에서 관찰 (여기에 논리 입력)하는 것입니다. MediatorLiveData 관찰자는 Activity / Fragment에서 관찰되지 않는 한 트리거되지 않습니다 (변환과 동일). 우리가하는 것은 실제 작업이 ViewModel에서 실제로 수행되는 Activity / Fragment에 빈 관찰을 넣는 것입니다.
// ViewModel
fun start(id : Long) : LiveData<User>? {
val liveData = MediatorLiveData<User>()
liveData.addSource(dataSource.getById(id), Observer {
if (it != null) {
// put your logic here
}
})
}
// Activity/Fragment
viewModel.start(id)?.observe(this, Observer {
// blank observe here
})
추신 : 나는 ViewModels 및 LiveData : Patterns + AntiPatterns 를 읽었 으며 변환을 제안했습니다. LiveData가 관찰되지 않으면 작동하지 않는다고 생각합니다 (아마도 Activity / Fragment에서 수행해야 함).
라이프 사이클 소유자 인터페이스가 필요하지 않은 observeForever를 사용할 수 있고 viewmodel의 결과를 관찰 할 수 있다고 생각합니다.
참조 URL : https://stackoverflow.com/questions/47515997/observing-livedata-from-viewmodel
'programing' 카테고리의 다른 글
iPhone Simulator에서 소리 끄기 (0) | 2021.01.16 |
---|---|
벡터 변환 (0) | 2021.01.16 |
Windows에서 ncurses를 사용할 수 있습니까? (0) | 2021.01.16 |
RTTI없이 C ++를 컴파일하면 언제 문제가 발생할 수 있습니까? (0) | 2021.01.16 |
앱 종료시 NSHTTPCookieStorage 상태가 저장되지 않습니다. (0) | 2021.01.16 |