Как работает этот код для комбинации LiveData? - PullRequest
0 голосов
/ 02 июля 2019

Я нашел этот интересный пост о LiveData (https://medium.com/androiddevelopers/livedata-beyond-the-viewmodel-reactive-patterns-using-transformations-and-mediatorlivedata-fda520ba00b7)

. В бонусном разделе автор создает расширение MediatorLiveData

/**
* Sets the value to the result of a function that is called when both 
`LiveData`s have data
* or when they receive updates after that.
*/
fun <T, A, B> LiveData<A>.combineAndCompute(other: LiveData<B>, onChange: (A,  
B) -> T): MediatorLiveData<T> {

var source1emitted = false
var source2emitted = false

val result = MediatorLiveData<T>()

val mergeF = {
   val source1Value = this.value
   val source2Value = other.value

   if (source1emitted && source2emitted) {
       result.value = onChange.invoke(source1Value!!, source2Value!! )
   }
}

result.addSource(this) { source1emitted = true; mergeF.invoke() }
result.addSource(other) { source2emitted = true; mergeF.invoke() }

return result
}

, а в репозитории оно выглядит как

 fun getDataForUser(newUser: String?): LiveData<UserDataResult> {
    if (newUser == null) {
      return MutableLiveData<UserDataResult>().apply { value = null }
    }

 return userOnlineDataSource.getOnlineTime(newUser)
       .combineAndCompute(userCheckinsDataSource.getCheckins(newUser)) { 
     a,b-> UserDataSuccess(a, b)
    }
 }

Мне интересно, как может выглядеть реализация UserDataSuccess. Я не совсем понимаю, что происходит в части onChange.

...