[swift] IGListDiffKit을 활용한 데이터 동기화

IGListDiffKit은 iOS 개발자들에게 데이터 동기화를 쉽게 처리할 수 있는 기능을 제공하는 도구입니다. IGListDiffKit을 사용하면 데이터의 변경 사항을 자동으로 감지하고, 필요한 업데이트만 적용하여 효율적으로 화면을 업데이트할 수 있습니다.

IGListDiffKit 소개

IGListDiffKit은 Instagram에서 개발한 라이브러리로, UICollectionView를 기반으로 한 화면을 효율적으로 업데이트하는 기능을 제공합니다. IGListDiffKit은 일종의 데이터 비교 알고리즘을 사용하여 이전 데이터와 새로운 데이터 사이의 차이를 계산하고, 변경된 부분만 업데이트하는 방식을 채택하고 있습니다.

IGListDiffKit 사용법

IGListDiffKit을 사용하기 위해선 몇 가지 단계를 따라야 합니다.

1. IGListDiffable 프로토콜 채택

데이터 모델 객체가 IGListDiffKit에서 사용될 수 있도록 하기 위해, 해당 객체는 IGListDiffable 프로토콜을 채택해야 합니다. 이 프로토콜을 채택하면 IGListDiffKit이 어떤 속성이 차이를 만들 수 있는지 파악할 수 있습니다.

class MyDataModel: NSObject, IGListDiffable {

    var id: String
    var name: String

    init(id: String, name: String) {
        self.id = id
        self.name = name
    }

    // MARK: IGListDiffable

    func diffIdentifier() -> NSObjectProtocol {
        return id as NSObjectProtocol
    }

    func isEqual(toDiffableObject object: IGListDiffable?) -> Bool {
        guard let object = object as? MyDataModel else { return false }
        return self.id == object.id && self.name == object.name
    }
}

2. Diffing 컨테이너 구성

변경된 데이터를 처리하기 위해 IGListDiffKit은 Diffing 컨테이너를 사용합니다. 이 컨테이너에 이전 데이터와 새로운 데이터를 설정하고, 업데이트가 필요한 아이템을 계산합니다.

let diffingContainer = ListDiffableContainer(
    array: newDataArray,
    sectionController: MySectionController(),
    userInfo: nil
)

let result = ListDiffPaths(
    result: ListDiff(
        oldArray: self.dataArray,
        newArray: diffingContainer.diffIdentifierArray,
        option: .equality
    ),
    section: 0
)

3. UICollectionView 업데이트

IGListDiffKit은 UICollectionViewDataSource 프로토콜을 준수하여 화면 업데이트를 진행합니다. UICollectionViewDataSource에서 데이터 업데이트 메서드를 구현하여 업데이트의 시작과 종료를 설정합니다.

class MySectionController: ListSectionController {

    var dataModel: MyDataModel?

    override func sizeForItem(at index: Int) -> CGSize {
        return CGSize(width: 100, height: 100)
    }

    override func cellForItem(at index: Int) -> UICollectionViewCell {
        guard let cell = collectionContext?.dequeueReusableCell(
            of: MyCell.self,
            for: self,
            at: index
        ) as? MyCell else { fatalError() }
            
        cell.configure(dataModel)
        
        return cell
    }

    // MARK: ListSectionControllerOverride
    
    override func didUpdate(to object: Any) {
        self.dataModel = object as? MyDataModel
    }

    override func didSelectItem(at index: Int) {
        // 아이템 선택 시 동작 구현
    }
}

결론

IGListDiffKit을 사용하면 데이터 동기화를 쉽고 효율적으로 처리할 수 있습니다. 이를 통해 iOS 앱의 화면 업데이트 성능을 향상시킬 수 있으며, 대량의 데이터 업데이트 시에도 부드럽고 빠른 화면 전환이 가능합니다.

참고 자료