>특강
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