4

필자는 데이터 가져 오기 (특히 Firebase)를 처리하는 별도의 클래스를 사용하며 대개 LiveData 객체를 반환하고 비동기 적으로 업데이트합니다. 이제 반환 된 데이터를 ViewModel에 저장하려고하지만 문제는 그 값을 가져 오기 위해 데이터 가져 오기 클래스에서 반환 된 LiveData 개체를 관찰해야한다는 것입니다. observe 메서드는 LifecycleOwner 객체를 첫 번째 매개 변수로 필요로하지만, 내 ViewModel 내부에는 없기 때문에 ViewModel 내부의 Activity/Fragment에 대한 참조를 유지하지 않아도됩니다. 어떻게해야합니까?ViewModel에서 LiveData 관찰하기

답변

2

this blog post Google 개발자 Jose Alcérreca가이 경우 변환을 사용하는 것이 좋습니다 ("저장소의 LiveData"단락 참조).

+0

변환 작업을 관리해 주셨습니까? 내 이벤트가 작동하지 않습니다 – romaneso

+1

변환에서 작성한 코드는 어떤 엔터티가 변환을 관찰 할 때만 실행되기 때문에 변환 자체는 작동하지 않습니다. – orbitbot

1

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에서 완료해야 함) 작동하지 않는다고 생각합니다.