[swift] Swift IGListKit을 사용한 페이징 처리하기

이번 글에서는 Swift에서 IGListKit을 사용하여 페이징 처리를 하는 방법을 알아보겠습니다. IGListKit은 iOS 애플리케이션에서 복잡한 리스트를 다루기 위한 유용한 도구입니다.

1. IGListKit 설치 및 설정

먼저, IGListKit을 프로젝트에 설치해야 합니다. CocoaPods가 설치되어 있다면, Podfile에 다음과 같이 추가합니다.

pod 'IGListKit'

그런 다음 터미널에서 pod install 명령어를 실행하여 IGListKit을 설치합니다.

2. IGListKit의 기본적인 사용 방법

IGListKit은 리스트의 항목을 관리하기 위한 ListAdapter와 데이터를 제공하기 위한 ListDiffable을 포함하고 있습니다. 먼저, ListAdapter를 초기화하고 데이터 소스를 설정해야 합니다. 다음은 예시입니다.

import IGListKit

class ViewController: UIViewController {

    let adapter: ListAdapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
    var data: [ListDiffable] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        adapter.collectionView = collectionView
        adapter.dataSource = self
    }
}

extension ViewController: ListAdapterDataSource {

    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return data
    }

    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        // Section controller 설정
    }

    func emptyView(for listAdapter: ListAdapter) -> UIView? {
        // 빈 화면을 표시하는 뷰 설정
    }
}

위의 예제에서 ListAdapterupdater는 데이터 변경 감지를 위한 업데이터 객체입니다. viewController는 현재 뷰 컨트롤러를 의미합니다. data는 리스트에 표시할 데이터 배열입니다.

ListAdapterDataSource 프로토콜을 구현하여 objects(for:) 메서드에서는 데이터 배열을 반환하고, listAdapter(_:sectionControllerFor:) 메서드에서는 각 섹션에 대한 컨트롤러를 설정합니다. emptyView(for:) 메서드는 데이터가 비어있을 때 표시될 뷰를 설정하는 메서드입니다.

3. 페이징 처리 구현하기

페이징 처리를 위해서는 서버에서 한 번에 가져올 데이터 개수와 현재 로드된 데이터의 개수를 추적해야 합니다. 또한, 스크롤이 가장 아래로 도달했을 때 새로운 데이터를 가져오는 로직을 구현해야 합니다.

다음은 IGListKit에서 페이징 처리를 구현하는 예시 코드입니다.

import IGListKit

class PagingSectionController: ListSectionController {

    var itemCount: Int = 10 // 한 번에 가져올 데이터 개수
    var loadedItemCount: Int = 0 // 현재 로드된 데이터 개수
    var isLoading: Bool = false // 데이터 로딩 중 여부

    override func didUpdate(to object: Any) {
        // 섹션에 대한 초기화 작업
        super.didUpdate(to: object)
        loadMoreData()
    }

    override func numberOfItems() -> Int {
        return loadedItemCount
    }

    override func sizeForItem(at index: Int) -> CGSize {
        // 각 아이템의 크기 설정
    }

    override func cellForItem(at index: Int) -> UICollectionViewCell {
        // 각 아이템에 대한 셀 구성
    }

    override func didScroll(with context: ListScrollContext) {
        super.didScroll(with: context)
        checkIfNeedLoadMoreData()
    }

    func loadMoreData() {
        guard !isLoading else {
            return
        }

        self.isLoading = true

        // 서버로부터 새로운 데이터를 가져오는 로직 구현
    }

    func checkIfNeedLoadMoreData() {
        let bottomOffset = collectionView.contentSize.height - collectionView.contentOffset.y
        if bottomOffset <= collectionView.bounds.height {
            loadMoreData()
        }
    }
}

위의 예시에서 PagingSectionController는 페이징 처리를 담당하는 섹션 컨트롤러입니다. itemCount는 한 번에 가져올 데이터 개수를, loadedItemCount는 현재 로드된 데이터 개수를 나타냅니다. isLoading은 데이터 로딩 중 여부를 확인하는 플래그입니다.

didUpdate(to:) 메서드에서 초기화 작업을 하고, numberOfItems() 메서드에서 현재 로드된 데이터 개수를 반환합니다. sizeForItem(at:) 메서드에서는 각 아이템의 크기를 설정하고, cellForItem(at:) 메서드에서는 각 아이템에 대한 셀을 구성합니다.

didScroll(with:) 메서드에서는 스크롤 이벤트가 발생한 경우 새로운 데이터를 가져올지 검사합니다. loadMoreData() 메서드에서는 서버로부터 새로운 데이터를 가져오는 로직을 구현합니다. checkIfNeedLoadMoreData() 메서드는 스크롤이 가장 아래로 도달했을 때 페이징 처리를 호출하는 역할을 합니다.

이제 위의 코드를 참고하여 프로젝트에 IGListKit을 통한 페이징 처리를 구현해보세요.

참고 자료