스팀 앱 개발기 #67 - TagsViewModel 클래스에 포스트 리스트 구하는 메소드 그리고 라이브 데이터 추가
시작하며...
지난 포스트까지 bridge.get_ranked_posts API 연동을 구현하였습니다. 이제 TagsViewModel 클래스에서 포스트 리스트를 구하는 기능을 구현할 예정입니다.
작업 개요
- TagsViewModel 클래스에 라이브 데이터 추가
- TagsViewModel 클래스에 readRankedPosts 메소드 추가
- TagsViewModel 클래스에 appendRankedPosts 메소드 추가
- 테스트 클래스 추가: TagsViewModelTest
TagsViewModel 클래스에 라이브 데이터 추가
이 클래스에 추가한 라이브 데이터들은 다음과 같습니다.
val tag = MutableLiveData("")
val sort = MutableLiveData("")
val rankedPosts = MutableLiveData<MutableList<PostItem>>(mutableListOf())
val readRankedPostsUseCase = ReadRankedPostsUseCase(SteemRepositoryImpl())
- tag: 현재 태그
- sort: 정렬 방식 (trending, hot, created, muted 등)
- rankedPosts: 포스트 리스트
- readRankedPostsUseCase: 포스트 리스트를 구하기 위한 유스 케이스 객체
TagsViewModel 클래스에 readRankedPosts 메소드 추가
이 메소드는 포스트 리스트를 구합니다.
fun readRankedPosts(
newSort: String,
newTag: String,
limit: Int = this.limit
) {
sort.value = newSort
tag.value = newTag
rankedPosts.value = mutableListOf()
readRankedPostsUseCase(
sort.value ?: GetRankedPostParamsDTO.InnerParams.SORT_TRENDING,
tag.value ?: ""
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { error ->
error.printStackTrace()
liveThrowable.value = error
listOf()
}
.subscribe { rankedPostItemList ->
rankedPosts.value = rankedPostItemList.toMutableList()
}
.also { disposable ->
compositeDisposable.add(disposable)
}
}
TagsViewModel 클래스에 appendRankedPosts 메소드 추가
이 메소드는 기존 포스트 리스트에 이어서 추가로 포스트들을 구합니다.
fun appendRankedPosts() {
val rankedPostsValue = rankedPosts.value ?: listOf()
if (rankedPostsValue.size < GetRankedPostParamsDTO.InnerParams.DEFAULT_LIMIT) {
return
}
val lastPostItem = when {
(rankedPostsValue.isEmpty()) -> null
else -> rankedPostsValue.last()
} ?: return
readRankedPostsUseCase(
sort.value ?: GetRankedPostParamsDTO.InnerParams.SORT_TRENDING,
tag.value ?: "",
lastPostItem = lastPostItem
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { error ->
error.printStackTrace()
liveThrowable.value = error
listOf()
}
.subscribe { rankedPostItemList ->
if (rankedPostsValue.isNotEmpty()) {
rankedPosts.value?.addAll(rankedPostItemList)
}
}
.also { disposable ->
compositeDisposable.add(disposable)
}
}
테스트 클래스 추가: TagsViewModelTest
TagsViewModel 클래스에 추가한 메소드들을 테스트하기 위해 TagsViewModelTest 클래스를 추가하였습니다.
- readRankedPosts 메소드: TagsViewModel 클래스의 readRankedPosts 메소드 테스트
- appendRankedPosts 메소드: TagsViewModel 클래스의 appendRankedPosts 메소드 테스트
class TagsViewModelTest : CommonPartOfViewModelTest() {
private val tagViewModel = TagsViewModel()
@Test
fun readRankedPosts() {
tagViewModel.readRankedPosts(
"trending",
"kr"
)
Thread.sleep(3000)
assertEquals(tagViewModel.rankedPosts.value?.size, tagViewModel.limit)
}
@Test
fun appendRankedPosts() {
tagViewModel.readRankedPosts(
"created",
"kr"
)
Thread.sleep(3000)
tagViewModel.appendRankedPosts()
Thread.sleep(3000)
assertEquals(tagViewModel.rankedPosts.value?.size, 2 * tagViewModel.limit)
}
}
GitHub Commit
- (1) Added new methods into TagsViewModel class (2) Added new class TagsViewModelTest
- Fixed build errors from WalletViewModelTest class
- 유닛 테스트 코드 빌드시 발생했던 빌드 오류 수정
마치며...
드디어 TagsViewModel 클래스 구현도 1차 완료하였습니다. 다음 포스트부터 TagsFragment 클래스의 화면 구현을 진행할 수 있을 것입니다.
지난 스팀 앱 개발기
- #66 - bridge.get_ranked_posts API 연동 구현: ReadRankedPostsUseCase 클래스 추가
- #65 - bridge.get_ranked_posts API 연동 구현: SteemRepository 인터페이스, SteemRepositoryImpl 클래스 수정
- #64 - bridge.get_ranked_posts API 연동 구현: SteemService 인터페이스에 메소드 추가
- #63 - bridge.get_ranked_posts API 관련 데이터 클래스 추가 수정
- #62 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 수정
- #61 - layout_post_item.xml 수정 후 예상치 못한 빌드 오류
- #60 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 정의
- #59 - 태그별 포스트 리스트를 구하기 위한 bridge.get_ranked_posts API
- #58 - 포스트 리스트를 구성할 항목의 레이아웃 (3) 데이터 클래스 정의 및 데이터 바인딩 적용
- #57 - 포스트 리스트를 구성할 항목의 레이아웃 (2)
- #56 - 포스트 리스트를 구성할 항목의 레이아웃
- #55 - .gitignore 파일 작성
- #54 - RxJava 관련 메모리 누수 방지 코드 작성
- #53 - 버그 수정: 인터넷 미연결시 API 실행하면 앱 강제 종료
- #52 - 인터넷 미연결시 API 실행하면 어떻게 될까?
- #51 - 파워다운 끝났으나 SP to power down 값이 0이 아닌 버그
- #1 ~ #50
Posted through the AVLE Dapp (https://avle.io)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Upvoted! Thank you for supporting witness @jswit.