最近,我已经了解了在设计应用程序的后端(存储库,而不是服务器端后端)时拥有单一来源(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()
可能看起来很奇怪。这样可以,还是有更好的方法?