필자는 데이터 가져 오기 (특히 Firebase)를 처리하는 별도의 클래스를 사용하며 대개 LiveData 객체를 반환하고 비동기 적으로 업데이트합니다. 이제 반환 된 데이터를 ViewModel에 저장하려고하지만 문제는 그 값을 가져 오기 위해 데이터 가져 오기 클래스에서 반환 된 LiveData 개체를 관찰해야한다는 것입니다. observe 메서드는 LifecycleOwner 객체를 첫 번째 매개 변수로 필요로하지만, 내 ViewModel 내부에는 없기 때문에 ViewModel 내부의 Activity/Fragment에 대한 참조를 유지하지 않아도됩니다. 어떻게해야합니까?ViewModel에서 LiveData 관찰하기
답변
this blog post Google 개발자 Jose Alcérreca가이 경우 변환을 사용하는 것이 좋습니다 ("저장소의 LiveData"단락 참조).
documnetation ViewModel에서
그러나 뷰 모델 객체는 LiveData 개체로 라이프 사이클 인식 관찰 가능한, 변경 사항을 준수하지 말아야합니다.
또 다른 방법은 데이터가 LiveData가 아닌 RxJava를 구현하는 것입니다. 그런 다음 라이프 사이클을 인식 할 수있는 이점이 없습니다.
todo-mvvm-live-kotlin의 Google 샘플에서 ViewModel의 LiveData없이 콜백을 사용합니다.
우리가 라이프 사이클웨어라는 전체 아이디어를 따르고 싶다면 Activity/Fragment에서 관찰 코드를 이동해야합니다. 그렇지 않으면 ViewModel에서 콜백 또는 RxJava를 사용할 수 있습니다.
또 다른 절충안은 MediatorLiveData (또는 변환)을 구현하고 ViewModel에서 관찰합니다 (여기에 논리를 추가하십시오). 알림 MediatorLiveData 옵저버는 Activity/Fragment에서 관찰되지 않는 한 변환을 실행하지 않습니다 (변환과 동일). 실제 작업이 ViewModel에서 실제로 수행되는 활동/단편에 빈 관찰을 넣는 것입니다.
// 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 and LiveData: Patterns + AntiPatterns을 읽었습니다. LiveData가 관찰되지 않으면 (아마 Activity/Fragment에서 완료해야 함) 작동하지 않는다고 생각합니다.
변환 작업을 관리해 주셨습니까? 내 이벤트가 작동하지 않습니다 – romaneso
변환에서 작성한 코드는 어떤 엔터티가 변환을 관찰 할 때만 실행되기 때문에 변환 자체는 작동하지 않습니다. – orbitbot