TestableCodeMobius
TestableCodeMobius copied to clipboard
Где должны быть проверки наличия данных кэша при большом количестве составляющих
Добрый день. У меня возник вопрос. Если экран содержит несколько компонентов данных которые не зависят друг от друга. Допустим в одном RecylerView надо вывести банеры рекламы, список последних просмотренных товаров, список популярных товаров и список рубрик. Эти четыре списка берутся из трех не зависимых частей и они могут попасть во view не одновременно, то есть Observable.zip в данном случае не подходит. Надо проверять наличие данных в кэше и в зависимости от результата отправлять запрос на получение данных.
Хотелось бы услышать ваше мнение, правильно ли делать 4 проверки наличия данных в кэше внутри презентера или стоит сделать обертку над этими списками и передать их в интерактор.
Как выглядит мой кэш: `public class RubricRootPresenterCash {
private final List<BannerModel> bannerModels;
private boolean bannerLoaded;
private final List<ProductModel> lastReviewedProducts;
private boolean lastReviewedProductsLoaded;
private final List<RubricModel> rubricModels;
public RubricRootPresenterCash() {
bannerModels = new ArrayList<>();
bannerLoaded = false;
lastReviewedProducts = new ArrayList<>();
rubricModels = new ArrayList<>();
}
public List<BannerModel> getBannerModels() {
return bannerModels;
}
public boolean isBannerLoaded() {
return bannerLoaded;
}
public List<ProductModel> getLastReviewedProducts() {
return lastReviewedProducts;
}
public boolean isLastReviewedProductsLoaded() {
return lastReviewedProductsLoaded;
}
public List<RubricModel> getRubricModels() {
return rubricModels;
}
public boolean isRubricModelsLoaded() {
return rubricModels.size() > 0;
}
}`
Так же интересно было бы знать что если необходимость загрузки одних данных зависит от других. Я сделал задачу где подается объявление в некоторую доску. В форме подачи объявления находится большое количество параметров, при этом есть список свойств которые динамически подгружаются из сервера в зависимости от выбраной рубрики. Где в таком случае будет находится наличие данных в кэше в зависимости от рубрики, в интеракторе или презентере?
Добрый день! Я бы всю эту логику перенес на Интерактор. Интерактор пусть наружу выдает Observable. Данный observable будет выдавать три эмита (когда загрузятся первые данные, вторые, третьи). У вас три модели данных. Сделайте общую обертку над ними. Тогда Вам будет удобнее работать в адаптере списка и удобнее передавать с Интерактора. В Интеракторе для вашего метода получения списка советую использовать combineLatest. Там есть нюанс с startWith, для того, чтобы ваш Observable сразу выдавал эмиты (а не ждал, пока загрузятся все). В этой задаче обсуждается - https://github.com/matzuk/TestableCodeMobius/issues/5 Решение вопроса о получении данных с кэша, затем запросе на сервер и выдачи свежих данных предлагаю отдать на Репозиторий. Соответствующие методы будут выдавать Observable с двумя эмитами (закешированные данные и данные с сервера). Если вы будете кстати сначала выдавать закешированные данные, то Вам не нужно заморачиваться с startWith. И тогда Ваш Observable в Интеракторе будет выдавать четыре эмита (все закешированные данные, первые загруженные, вторые, третьи. Все данные должны храниться в Data уровне, и получаются они с Репозитория. В Презентере Вы можете хранить только какие-то временные переменные для корректной работы UI. Надеюсь, я полностью ответил на Ваш вопрос :)
Большое спасибо!