[swift] IGListDiffKit을 이용한 데이터 변경 감지 작업

이 포스트에서는 IGListDiffKit을 사용하여 데이터 변경을 감지하는 방법에 대해 알아보겠습니다. IGListDiffKit은 Instagram에서 개발된 라이브러리로, UICollectionView에서 데이터의 변화를 감지하여 UI를 업데이트하는 데 사용됩니다.

IGListDiffKit이란?

IGListDiffKit은 UICollectionView에서 데이터의 변경을 효율적으로 감지하고, 변경된 부분만 업데이트하는 기능을 제공하는 라이브러리입니다. 이를 통해 컬렉션 뷰의 퍼포먼스를 향상시킬 수 있으며, 복잡한 데이터 구조에서도 간편하게 변경사항을 추적할 수 있습니다.

IGListDiffable 프로토콜

IGListDiffKit에서 데이터 변경 감지를 위해 IGListDiffable 프로토콜을 구현해야 합니다. 이 프로토콜을 채택하면, IGListDiffKit이 객체의 식별자와 비교하여 변경된 부분을 찾을 수 있습니다.

class MyModel: NSObject, IGListDiffable {
    let identifier: String
    let value: String
    
    init(identifier: String, value: String) {
        self.identifier = identifier
        self.value = value
    }
    
    // IGListDiffable 프로토콜 구현
    func diffIdentifier() -> NSObjectProtocol {
        return identifier as NSObjectProtocol
    }
    
    func isEqual(toDiffableObject object: IGListDiffable?) -> Bool {
        guard let object = object as? MyModel else { return false }
        return value == object.value
    }
}

위의 예시에서는 MyModel 클래스가 IGListDiffable 프로토콜을 구현하고 있습니다. diffIdentifier() 메서드는 객체의 식별자를 반환하며, isEqual(toDiffableObject:) 메서드는 비교하여 동일한 객체인지 확인하는 로직을 작성합니다.

IGListDiffableDataSource

IGListDiffableDataSource는 IGListDiffable 프로토콜을 준수하는 객체의 데이터를 UICollectionView에 표시하는 역할을 담당합니다. IGListKit을 사용하여 데이터 바인딩을 수행할 때 주로 사용됩니다.

class MyDataSource: NSObject, IGListDiffableDataSource {
    var data: [MyModel] = []
    
    // IGListDiffableDataSource 프로토콜 구현
    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return data
    }
    
    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        return MySectionController()
    }
    
    func emptyView(for listAdapter: ListAdapter) -> UIView? {
        return nil
    }
}

위의 예시에서는 MyDataSource 클래스가 IGListDiffableDataSource 프로토콜을 구현하고 있습니다. objects(for:) 메서드에서 데이터 객체를 반환하며, listAdapter(_:sectionControllerFor:) 메서드에서는 해당 데이터에 대한 섹션 컨트롤러를 반환합니다. emptyView(for:) 메서드를 사용하여 데이터가 비어있을 때 표시할 뷰를 지정할 수 있습니다.

IGListAdapter

IGListAdapter는 IGListDiffableDataSource와 UICollectionView를 연결하여 데이터 변경을 감지하고 UI를 업데이트하는 역할을 수행합니다.

class ViewController: UIViewController {
    let collectionView: UICollectionView = ...
    let dataSource = MyDataSource()
    lazy var adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self, workingRangeSize: 0)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        adapter.collectionView = collectionView
        adapter.dataSource = dataSource
    }
}

위의 예시에서는 ViewController 클래스에 collectionView와 dataSource 객체를 생성하고, adapter를 초기화하여 collectionView와 dataSource를 연결하고 있습니다. 이렇게 설정된 adapter는 데이터의 변경을 감지하여 collectionView를 자동으로 업데이트합니다.

결론

IGListDiffKit을 사용하여 데이터 변경을 감지하는 작업을 쉽게 처리할 수 있습니다. IGListDiffable 프로토콜을 구현하여 데이터 식별자를 정의하고, IGListDiffableDataSource와 IGListAdapter를 통해 데이터를 효율적으로 관리하고 퍼포먼스를 향상시킬 수 있습니다.

더 많은 자세한 내용과 예시 코드를 위한 IGListDiffKit의 공식 문서를 참고하세요.

참고 자료: