[swift] IGListDiffKit과 함께하는 콜렉션 뷰 구현 패턴
소개
IGListDiffKit은 iOS에서 콜렉션 뷰를 구현할 때 사용할 수 있는 유용한 도구입니다. 이 도구를 사용하면 콜렉션 뷰에서 발생하는 데이터 변경을 쉽게 처리할 수 있습니다. IGListDiffKit은 데이터 소스와 콜렉션 뷰 간의 차이를 계산하여 변경 사항을 적용하는 기능을 제공합니다. 이로써 효율적이고 일관된 콜렉션 뷰 구현을 할 수 있습니다.
IGListDiffKit 사용하기
IGListDiffKit을 사용하기 위해서는 몇 가지 단계를 거쳐야 합니다. 먼저 IGListKit 라이브러리를 프로젝트에 추가해야 합니다. IGListKit은 IGListDiffKit을 포함하고 있습니다.
-
Cocoapods를 통해 IGListKit을 설치합니다.
pod 'IGListKit'
-
IGListDiffable 프로토콜을 채택한 데이터 모델을 생성합니다. 이 프로토콜은 데이터 소스와 콜렉션 뷰 간의 변경 차이를 계산하는 데 필요한 메서드를 정의합니다.
import IGListKit class MyDataModel: NSObject, IGListDiffable { let id: String let name: String init(id: String, name: String) { self.id = id self.name = name } func diffIdentifier() -> NSObjectProtocol { return id as NSObjectProtocol } func isEqual(toDiffableObject object: IGListDiffable?) -> Bool { guard let object = object as? MyDataModel else { return false } return id == object.id && name == object.name } }
-
IGListAdapter 객체를 생성하고 콜렉션 뷰와 데이터 소스를 연결합니다.
import IGListKit class MyViewController: UIViewController, ListAdapterDataSource { let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout()) var data: [MyDataModel] = [] override func viewDidLoad() { super.viewDidLoad() let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self) adapter.collectionView = collectionView adapter.dataSource = self } // MARK: ListAdapterDataSource 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 } }
-
콜렉션 뷰 데이터 소스 변경을 감지하는 메서드를 구현합니다. 이 메서드에서 데이터 변경을 처리하고, 콜렉션 뷰 갱신을 위해 IGListAdapter의
performUpdates(animated:)
메서드를 호출합니다.import IGListKit class MyViewController: UIViewController, ListAdapterDataSource { // ... func updateData(newData: [MyDataModel]) { let diffResult = ListDiffPaths(fromSection: 0, toSection: 0, oldArray: data, newArray: newData, option: .equality) data = newData adapter.performUpdates(animated: true) } }
결론
IGListDiffKit을 사용하면 콜렉션 뷰의 데이터 변경을 효율적으로 처리할 수 있습니다. IGListDiffKit을 적용하면 일관성 있는 콜렉션 뷰 구현 패턴을 유지할 수 있으며, 데이터의 변경에 따른 뷰 업데이트를 쉽게 처리할 수 있습니다.
참고 문서: