코틀린-안드로이드

70일차)특강(flow, Uistate), 팀프로젝트(YoutubeProject)

songyooho 2024. 8. 19. 22:01

>특강

1. Flow사용이유

-livedata의 경우 안드로이드 플랫폼에 종속적이고 UI가 없는곳에서 사용하기 어려움

-domainLayer에서 livedata사용이 어려움

=>이로 인해 Flow를 상ㅇ

 

2. Flow란

-코틀린에서 쓸 수 있는 비동기 스트림(데이터를 일정한 순서에 따라 연속적으로 처리,전달하는 방식)

-사용방법

<1>flow builder함수로 코드블록 구성후 emit을 호출해 데이터를 보냄

=>flow는 콜드 스트림이라 요청측에서 collect호출해서 값ㅇㄹ 발생시킴

<2>생명주기를 모르므로 생명주기에 따른 처리 필요

<3>cold stream이므로 연속해서 들어오는 데이터 처리 불가.

<4>예시

override suspend fun searchUserVideoList(query: String): Flow<List<User>> {
    return flow { emit(toVideoUser(searchRemoteDataSource.getSearchVideo(query).documents.orEmpty()))  }
}
searchRepository.searchUserImageList(query)
    .zip(searchRepository.searchUserVideoList(query)) { imageList, videoList ->
        return@zip (imageList + videoList).sortedByDescending { it.dateTime }
    }.flowOn(Dispatchers.IO)
    .catch { error ->
        _searchUiState.value = UiState.Error(error.toString())
    }
    .collect {
        _searchUiState.value = UiState.Success(it)
    }

 

3. StateFlow

-초기값이 필요

-replaycache를 1로 고정된 값을 가짐(livedata와 유사)

-non-suspending으로 .value로 get, set이 가능 <=>livedata는 앱이 백그라운드로 가면 statflow와 달리 옵저버가 관찰 취소

-state관리에 최적화 되어있으며 항상 마지막 상태를 return

 

4. sharedFlow

-초기값이 필요없음

-replayCache를 직접 정의 가능하며 기본값은 0.

=>기본값사용시 구성 변경해도 기존 구독자뿐만 아니라 새구독자에게도 값이 방출 x

-주의점: viewmodel에서 init에서 sharedflow로 데이터 전송시 collector가 아직 수집 시작을 안 한 경우 해당 데이터 방출을 놓칠 수 있음

 

5.UiState

-데이터 레이어에서 가져온 데이터, 도중의 로딩상태, 기본상태, 성공, 실패등이 경우에 따른 Ui state로 사용자에게 보여질 UI상태를 나타낸다.

-주로 sealed class(interface)로 많이 사용함.

sealed interface UiState<out T> {

    data class Success<T>(val data: T) : UiState<T>

    data class Error(val message: String) : UiState<Nothing>

    object Loading : UiState<Nothing>

}

 

@Mapper

DataSource에서 가져온 entity를 프로그램내에서 사용할 model로 변환 시키는 메소드를 mapper라 한다.

 

>팀프로젝트

https://appdevelopjava.tistory.com/95

 

데이터 레이어 작성, 로그인 및 회원가입과 스플래시 작성

>데이터 레이어 구조@데이터 종류1. 캐시 데이터1)카테고리 데이터 - 채널, 비디오-CategoryModel을 nextPageToken과 CategoryResponse로 나누어 저장.=>새 데이터가 들어오면 토큰은 replace하고 response는 추가하

appdevelopjava.tistory.com