[Swift] RxSwift 스크롤 뷰 무한 스크롤링(Infinite Scroll)
- 모바일/아이폰
- 2022. 8. 30.
아이폰 앱을 만들면 무한 스크롤을 구현해야 하는 경우가 있습니다. 주로 서버에서 보내온 데이터가 페이징 처리가 되있는 경우에 무한 스크롤을 구현합니다. 더보기 버튼을 만들어서 구현할 수 도 있지만 더 보기 버튼 보다는 무한 스크롤로 테이블 뷰를 구현하는 것이 더 자연스럽습니다. 지금 부터 무한 스크롤을 위해서 필요한 것들과 방법에 대해서 알아보겠습니다.
ViewModel 코드 (데이터 정의)
▼ 우선 통신하는 부분을 보겠습니다. 코드가 길어서 복잡해보이겠지만 단순합니다. totalPage, currentPage, isLoading 변수를 선언해줍니다. 데이터 통신이 끝나면 테이블 뷰 데이터에 기존 데이터를 포함해서 appendData를 해줍니다. 또한 통신이 시작하기 전에 isLoading 값을 true로 변경해줍니다. 그리고 통신이 끝난 시점에 isLoading을 false값으로 변경해줍니다. 통신하는 부분은 저와 다를 수 있지만 핵심은 다음 변수 들입니다.
- totalPage : 전체 페이지 수 (서버에서 받은 값)
- currentPage : 현재 로드된 페이지 값
- isLoading : 현재 통신 중인지 확인하는 Boolean 값
▼ 통신을 시작하기 전에 다음과 같이 totalPage와 currentPage 가 같다면 더 이상 진행을 하지 않습니다.
▼ 위에 코드중에 totalPage, currentPage 값을 설정하는 부분만 보겠습니다. 서버에서 받은 totalPage 값이 currentPage와 같지 않는 다면 새로운 페이지 값을 적용해줍니다.
ViewController 코드 (UI 정의)
▼ 이제 뷰컨트롤러에서 테이블 뷰를 바인딩해줍니다. 저는 RxCocoa를 사용해서 바인딩 했는데 일반적인 테이블 뷰 델리게이터를 사용해서 구현해도 됩니다.
▼ 다음과 같이 viewDidLoad나 초기화 하는 부분에서 delegate = self를 해서 적용해줍니다. 그리고 최초에 한 번 통신을 시작합니다.
▼ 이제 UIScrollViewDelegate 델리게이터의 scrollViewDidScroll 핸들러를 구현해줍니다. 이는 테이블 뷰 컨트롤러 델리게이트가 이미 UIScrollViewDelegate를 구현하고 있기 때문에 다음과 같이 구현하면 동작되는 것을 볼 수 있습니다. 이제 viewModel에서 isLoading 값을 가져와 값이 false라면 화면이 끝에 닿을 때에 해당 통신을 추가적으로 실행하게 됩니다.
▼ 위의 코드에서 다음 부분은 스크롤 뷰의 끝에 닿았을 때를 계산해줍니다. 만약 isLoading 값으로 확인하지 않으면 통신을 연속으로 호출 할 수 있으니 주의하시길 바랍니다.
'모바일 > 아이폰' 카테고리의 다른 글
[Swift] 앱 시스템 설정 페이지 메뉴로 이동 (앨범, 카메라, 언어 설정) (0) | 2022.09.17 |
---|---|
[iOS] 아이폰 시뮬레이터 다크모드 설정 (Dark Appearance) (0) | 2022.09.06 |
[Swift] Autolayout Multiplier 비율 동적으로 적용하기 (2) | 2022.08.30 |
[Xcode] Code Snippet 코드 스니펫 사용법 및 iCloud 동기화 (0) | 2022.07.07 |
[UIKit] iOS Swift - CollectionView 컬렉션 뷰 만들기 기본 (0) | 2022.05.25 |