TestableCodeMobius icon indicating copy to clipboard operation
TestableCodeMobius copied to clipboard

Где должны быть проверки наличия данных кэша при большом количестве составляющих

Open Yura-Savchuk opened this issue 8 years ago • 2 comments

Добрый день. У меня возник вопрос. Если экран содержит несколько компонентов данных которые не зависят друг от друга. Допустим в одном 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;
}

}`

Так же интересно было бы знать что если необходимость загрузки одних данных зависит от других. Я сделал задачу где подается объявление в некоторую доску. В форме подачи объявления находится большое количество параметров, при этом есть список свойств которые динамически подгружаются из сервера в зависимости от выбраной рубрики. Где в таком случае будет находится наличие данных в кэше в зависимости от рубрики, в интеракторе или презентере?

Yura-Savchuk avatar Dec 06 '16 09:12 Yura-Savchuk

Добрый день! Я бы всю эту логику перенес на Интерактор. Интерактор пусть наружу выдает Observable. Данный observable будет выдавать три эмита (когда загрузятся первые данные, вторые, третьи). У вас три модели данных. Сделайте общую обертку над ними. Тогда Вам будет удобнее работать в адаптере списка и удобнее передавать с Интерактора. В Интеракторе для вашего метода получения списка советую использовать combineLatest. Там есть нюанс с startWith, для того, чтобы ваш Observable сразу выдавал эмиты (а не ждал, пока загрузятся все). В этой задаче обсуждается - https://github.com/matzuk/TestableCodeMobius/issues/5 Решение вопроса о получении данных с кэша, затем запросе на сервер и выдачи свежих данных предлагаю отдать на Репозиторий. Соответствующие методы будут выдавать Observable с двумя эмитами (закешированные данные и данные с сервера). Если вы будете кстати сначала выдавать закешированные данные, то Вам не нужно заморачиваться с startWith. И тогда Ваш Observable в Интеракторе будет выдавать четыре эмита (все закешированные данные, первые загруженные, вторые, третьи. Все данные должны храниться в Data уровне, и получаются они с Репозитория. В Презентере Вы можете хранить только какие-то временные переменные для корректной работы UI. Надеюсь, я полностью ответил на Ваш вопрос :)

matzuk avatar Dec 10 '16 08:12 matzuk

Большое спасибо!

Yura-Savchuk avatar Jan 06 '17 08:01 Yura-Savchuk