내부의 load 함수가 호출될 때 위 역할을 수행한다.
load 함수 호출 시 인자로 받아오는 loadType에 따라 다른 행동을 하도록 할 수 있다.
LoadType.*REFRESH
* : load 함수가 처음으로 호출되거나 연결된 PagingDataAdapter에서 refresh 함수를 호출할 때 이것을 인자로 갖는 load 함수가 호출된다.
load 함수가 처음으로 호출될 때 인자로 주는 설정은 다음과 같이 할 수 있다.
LAUNCH_INITIAL_REFRESH
대신 SKIP_INITIAL_REFRESH
를 사용하면 처음 REFRESH를 생략할 수 있다.
LoadType.*PREPEND
* : load된 PagingData의 시작 지점에 도달할 때 이것을 인자로 갖는 load 함수를 호출한다. prefetchDistance의 영향을 받는다.
LoadType.*APPEND
* : load된 PagingData의 끝 지점에 도달할 때 이것을 인자로 갖는 load 함수를 호출한다. prefetchDistance의 영향을 받는다.
공유 화면 처음 실행 시 (REFRESH) : RemoteMediator는 캐싱된 데이터를 모두 지우고 서버에서 초기 정렬 기준 (최신순)에 따라 10개의 데이터를 받아와서 로컬 데이터베이스에 캐싱한다.
스크롤을 내릴 때 (APPEND) : PagingDataAdapter가 보여줄 데이터가 부족하다고 판단하면 서버에서 다음 데이터를 가져올 수 있도록 RemoteMediator에게 요청한다. 캐싱된 데이터는 그대로 남긴 채 새로운 데이터만 로컬 데이터베이스에 캐싱한다.
스크롤을 올릴 때 : 아무런 변화도 일어나지 않는다.
정렬 기준을 바꿀 때 (REFRESH) : RemoteMediator의 내부 속성을 바꾸어 load 함수가 해당 기준으로 정렬된 데이터를 서버에 요청하도록 변경한다. 단순히 load 함수의 기능을 변경하는 것만으로는 작동하지 않으며, PagingDataAdapter에서 refresh 함수를 호출하여 RemoteMediator에서 LoadType.*REFRESH*
를 인자로 갖는 load 함수를 실행함으로서 전체 캐싱 데이터가 변경된다.
캐싱 이후 화면에 표시할 때 : ViewModel은 Pager.flow를 collect하여 데이터가 변경되면 uiState를 업데이트한다. uiState는 밑 코드와 같이 구성되어있으며, StateFlow로 감싸서 Fragment에서 이를 collect하여 PagingDataAdapter에 적용하도록 구현했다. CoroutineExceptionHandler를 활용하여 네트워크 오류를 판단하고, Exception 발생 시 uiState에 Error 타입의 객체를 넣어서 사용자가 인식할 수 있도록 했다.