Я не уверен, что с «вложенными LiveData» все в порядке. Когда мы работаем с любой реализацией разработки, управляемой событиями (LiveData
, RxJava
, Flow
), мы обычно должны предполагать, что события дискретных данных являются неизменяемыми, а операции над этими событиями являются чисто функциональными. Быть неизменным НЕ является синонимом только для чтения (val
). Неизменный означает неизменный. Он должен быть постоянным во времени и работать точно так же при любых обстоятельствах. Это одна из причин, почему мне странно иметь LiveData
или ArrayList
членов в классе данных, независимо от того, определены они только для чтения или нет.
Другая, техническая причина, по которой следует избегать вложенных потоки: их почти невозможно правильно наблюдать. Каждый раз, когда через внешний поток отправляется новое событие данных, разработчики должны обязательно удалить внутренние подписки, прежде чем наблюдать за новым внутренним потоком, иначе это может вызвать всевозможные проблемы. Какой смысл иметь наблюдателей, осведомленных о жизненном цикле, когда разработчикам нужно вручную отписаться от них?
Почти во всех сценариях ios вложенные потоки могут быть преобразованы в один слой потока. В вашем случае:
class ViewModel: ViewModel() {
val contentList: LiveData<PagedList<Content>>
val anotherAttribute: LiveData<Int>
private val swipeToRefreshTrigger = MutableLiveData<Boolean>(true)
init {
contentList = Transformations.switchMap(swipeToRefreshTrigger) {
getContentList(...)
}
anotherAttribute = ...
}
override fun swipeToRefresh(event: SwipeToRefresh) {
swipeToRefreshTrigger.postValue(true)
}
}
Примечания к PagedList
:
PagedList
также изменчивы, но я думаю, это то, с чем нам просто нужно жить. PagedList
использование - еще одна топика c, поэтому я не буду обсуждать это здесь.