[swift] IGListKit에서 데이터 정렬 및 그룹화하는 방법

IGListKit은 iOS 애플리케이션에서 복잡한 데이터 목록을 관리하는 데 도움을 주는 강력한 프레임워크입니다. IGListKit을 사용하면 데이터를 효율적으로 정렬하고 그룹화할 수 있습니다. 이번 블로그 글에서는 IGListKit을 사용하여 데이터를 정렬하고 그룹화하는 방법에 대해 알아보겠습니다.

1. 데이터 정렬

IGListKit에서 데이터를 정렬하려면 아래와 같은 단계를 따를 수 있습니다.

1.1. 모델 클래스 생성

먼저, 데이터 모델을 나타내는 클래스를 생성해야합니다. 예를 들어, 사용자를 표현하는 모델 클래스를 만들어보겠습니다.

class User {
    let name: String
    let age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

1.2. 데이터 소스 생성

이제 데이터를 관리하는 데이터 소스를 생성합니다. IGListSectionController 클래스를 상속하고, IGListDiffable 프로토콜을 구현하는 클래스를 만듭니다. 데이터 소스의 diffIdentifier 메서드를 재정의하여 고유 식별자를 반환하도록 설정해야 합니다.

class UserSectionController: NSObject, IGListSectionController {
    var user: User?

    func numberOfItems() -> Int {
        return 1
    }

    func sizeForItem(at index: Int) -> CGSize {
        return CGSize(width: collectionContext?.containerSize.width ?? 0, height: 50)
    }

    func cellForItem(at index: Int) -> UICollectionViewCell {
        // 셀 생성 및 설정
    }

    func didUpdate(to object: Any) {
        self.user = object as? User
    }

    func didSelectItem(at index: Int) {
        // 아이템 선택 시 동작
    }
    
    // IGListDiffable 프로토콜 구현
    
    func diffIdentifier() -> NSObjectProtocol {
        return self.user?.name as NSObjectProtocol? ?? NSObjectProtocol()
    }
    
    func isEqual(toDiffableObject object: IGListDiffable?) -> Bool {
        guard let object = object as? UserSectionController else {
            return false
        }
        return self.user?.name == object.user?.name
    }
}

1.3. 컨트롤러 설정

마지막으로, 컨트롤러에서 데이터 소스를 설정합니다. 데이터를 정렬할 수 있는 UICollectionViewDiffableDataSource를 사용하여 데이터를 관리합니다. 아래는 예시 코드입니다.

class ViewController: UIViewController {
    lazy var collectionView: UICollectionView = {
        // 컬렉션 뷰 설정
    }()
    
    lazy var dataSource: UICollectionViewDiffableDataSource<Int, User> = {
        let dataSource = UICollectionViewDiffableDataSource<Int, User>(collectionView: self.collectionView) { (collectionView, indexPath, user) -> UICollectionViewCell? in
            // 셀 생성 및 설정
        }
        return dataSource
    }()
    
    var users: [User] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 데이터 소스 등록
        collectionView.dataSource = dataSource
        
        // 데이터 정렬
        self.users.sort { $0.name < $1.name }
        var snapshot = NSDiffableDataSourceSnapshot<Int, User>()
        snapshot.appendSections([0])
        snapshot.appendItems(self.users)
        dataSource.apply(snapshot, animatingDifferences: true)
    }
}

위의 코드에서 $0.name < $1.name은 이름을 기준으로 오름차순으로 데이터를 정렬하는 코드입니다. 필요에 따라 데이터를 다른 기준으로 정렬할 수도 있습니다.

2. 데이터 그룹화

IGListKit을 사용하면 데이터를 그룹화하여 표시할 수도 있습니다. 데이터를 그룹화하려면 데이터 모델에 그룹 식별자를 추가하고, 데이터 소스에서 이를 활용하여 그룹화된 섹션을 생성하면 됩니다. 아래는 예시 코드입니다.

class User {
    let name: String
    let age: Int
    let group: String  // 추가: 그룹 식별자
    
    init(name: String, age: Int, group: String) {
        self.name = name
        self.age = age
        self.group = group
    }
}

class UserSectionController: NSObject, IGListSectionController {
    var users: [User]?
    var group: String = ""
    
    // ...

    func didUpdate(to object: Any) {
        guard let group = object as? String else {
            return
        }
        self.group = group
        self.users = self.fetchUsers(for: group)
    }
    
    // ...

    func fetchUsers(for group: String) -> [User] {
        // 식별자에 따라 데이터를 검색하고 반환하는 로직
        // ...
    }
    
    // ...
}

class ViewController: UIViewController {
    lazy var collectionView: UICollectionView = {
        // 컬렉션 뷰 설정
    }()
    
    // ...
    
    var groups: [String] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // ...
        
        // 데이터 그룹화
        var snapshot = NSDiffableDataSourceSnapshot<Int, String>()
        snapshot.appendSections(Array(0..<groups.count))
        snapshot.appendItems(groups, toSection: 0)
        dataSource.apply(snapshot, animatingDifferences: true)
    }
}

위의 코드에서 group이라는 그룹 식별자를 추가하고, groups 배열에는 그룹 식별자들을 저장합니다. 그룹화된 섹션을 표시하기 위해 NSDiffableDataSourceSnapshot 객체에 groups 배열을 추가하는 코드가 포함되어 있습니다.

이렇게 하면 IGListKit을 사용하여 데이터를 정렬하고 그룹화하는 것이 가능합니다. IGListKit을 사용하면 다양한 데이터 처리 기능을 제공하므로, 애플리케이션의 데이터 목록 관리를 용이하게 할 수 있습니다.

참고 자료