【问题标题】:Mosby MVI - How to reuse presenterMosby MVI - 如何重用 Presenter
【发布时间】:2017-06-22 06:13:45
【问题描述】:

我的演示者如下所示:

// I'm retaining the presenter in a singleton instances map and reuse them
// because they are loading data from the internet and this should be done once 
// per app start only
public static ArticlePresenter get(Article article)
{
    if (INSTANCES.containsKey(article.id()))
        return INSTANCES.get(article.id());
    ArticlePresenter instance = new ArticlePresenter();
    INSTANCES.put(article.id(), instance);
    return instance;
}

@Override
protected void bindIntents()
{
    ArrayList<Observable<ArticlePartialStateChanges>> observables = new ArrayList<>();

    observables.add(intent(ArticleView::loadArticleIntent)
            .doOnNext(article -> L.d("intent: loadArticleIntent"))
            .flatMap(article -> AndroInteractor.loadArticle(article)
                    .map(data -> (ArticlePartialStateChanges) new ArticlePartialStateChanges.Loaded(data))
                    .startWith(new ArticlePartialStateChanges.LoadingArticle(article))
                    .onErrorReturn(ArticlePartialStateChanges.LoadingArticleError::new)
                    .subscribeOn(Schedulers.io())
            )
    );

    Observable<ArticlePartialStateChanges> allIntents = Observable.merge(observables);
    ArticleViewState initialState = ArticleViewState.builder().build();
    Observable<ArticleViewState> stateObservable = allIntents
            .scan(initialState, this::viewStateReducer)
            .observeOn(AndroidSchedulers.mainThread());
    subscribeViewState(stateObservable, ArticleView::render);
}

我的片段的loadArticleIntent 如下所示:

@Override
public Observable<Article> loadArticleIntent()
{
    return Observable.just(article).doOnComplete(() -> L.d("Article loaded"));
}

结果

如果片段是第一次创建,我会得到以下 3 项:

  1. 初始事件
  2. 加载文章事件
  3. 加载的文章或错误事件

如果再次创建片段,它将从地图中检索已经存在的演示者,并重用其中的最后一个已知状态。然后我得到以下信息:

  1. 最后加载的事件
  2. 初始事件
  3. 加载文章事件
  4. 加载的文章或错误事件

这并不完美,我需要将逻辑更改为仅发出最后一个已知状态(与屏幕旋转后发生的行为相同)。

我应该如何解决这个问题?

【问题讨论】:

  • 不要重复使用演示者。如果他们正在执行网络操作并且您希望避免重复它们,则应将缓存放置在网络层

标签: android mosby


【解决方案1】:

不要重复使用 Presenter。这不是它的本意。重用它们今天可能会奏效,但不能保证将来也能奏效。

所以基本上你只想使用从业务逻辑中检索到的数据,对吧?基本上你希望这部分预加载数据AndroInteractor.loadArticle(article)。所以只需在应用程序启动时调用它,而不是整个演示者。也许你使用一些内存/磁盘缓存库,或者只是在AndroInteractor.loadArticle(article) 内部使用BehaviorSubject。那个拥有最新的数据(如果有的话)。

所以您的问题只是“业务逻辑问题”/“数据缓存问题”,而不是真正的“演示者”问题。因此,你应该在业务逻辑层解决这个问题,即AndroInteractor.loadArticle(article),而不是保留整个Presenter。

【讨论】:

  • 您说的完全正确,这当然更有意义。这样我什至可以从Interactor 中获取初始状态,如果Interactor 已经有缓存状态,甚至可以过滤掉loadPageIntent 的事件。
猜你喜欢
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多