Android:存储库模式和分页

时间:2018-02-18 08:40:08

标签: android kotlin rx-java2

最近,我已经了解了在设计应用程序的后端(存储库,而不是服务器端后端)时拥有单一来源(SSOT)的重要性。 https://developer.android.com/topic/libraries/architecture/guide.html

通过开发新闻Feed应用程序(使用真棒https://newsapi.org/),我试图了解有关应用程序架构的更多信息。但是,我不确定如何实现分页。顺便说一下,。:我正在使用MVVM作为我的表示层。 View订阅了ViewModel的LiveData。 ViewModel订阅了RxJava流。

我想出了以下方法:

interface NewsFeedRepository {
        fun getNewsFeed(): Observable<List<Article>>
        fun refreshFeed(): Completable
        fun loadMore(): Completable
}

ViewModel订阅getNewsFeed() Observable,它在每次数据库中的基础数据(SSOT)发生变化时发出数据。但是,我的问题是关于loadMore()方法。 此方法尝试从API加载更多文章,并在成功时将它们插入本地数据库。这会导致getNewsFeed()发出新的Feed数据。

我的问题:

1。存储库是否应负责同步API和本地数据库数据?或者存储库是否应该使用一些管理同步网络/本地数据的“低级”API?

2。方法loadMore会返回Completable,这可能看起来很奇怪/误导。是否有更好的方法在存储库界面中指示分页?

3. 分页意味着存储当前页数,并在从API请求数据时使用它。应该在哪里存储当前页数?在存储库中?或者在存储库使用的某些“低级”组件中?

interface SearchArticleRepository {
    fun searchArticles(sources: List<NewsSource>? = null, query: String? = null): Flowable<List<Article>>
    fun moreArticles(): Completable  
}

此存储库用于搜索文章。方法moreArticles()会尝试从API加载更多文章,具体取决于对searchArticles(...)的最后一次调用。例如:ViewModel调用repo.searchArticles(q = "bitcoin")。对repo.moreArticles()的调用会尝试从API加载包含查询字符串"bitcoin"的更多文章,并与本地数据库同步。

我的问题再次提出:

1。是否可以存储有关上一个请求(searchArticles(request)在存储库中的信息?我也可以考虑在moreArticles()中传递请求参数,例如moreArticles(sources: List<NewsSource>? = null, query: String? = null)。这样,存储库就不必存储有关上一个请求的信息。

2。再次,在Completable中返回moreArticles()可能看起来很奇怪。这样可以,还是有更好的方法?

0 个答案:

没有答案