스팀 앱 개발기 #67 - TagsViewModel 클래스에 포스트 리스트 구하는 메소드 그리고 라이브 데이터 추가steemCreated with Sketch.

시작하며...

지난 포스트까지 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


마치며...

드디어 TagsViewModel 클래스 구현도 1차 완료하였습니다. 다음 포스트부터 TagsFragment 클래스의 화면 구현을 진행할 수 있을 것입니다.


지난 스팀 앱 개발기

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57810.45
ETH 3116.57
USDT 1.00
SBD 2.43