[swift] IGListDiffKit과 함께하는 콜렉션 뷰 구현 패턴

소개

IGListDiffKit은 iOS에서 콜렉션 뷰를 구현할 때 사용할 수 있는 유용한 도구입니다. 이 도구를 사용하면 콜렉션 뷰에서 발생하는 데이터 변경을 쉽게 처리할 수 있습니다. IGListDiffKit은 데이터 소스와 콜렉션 뷰 간의 차이를 계산하여 변경 사항을 적용하는 기능을 제공합니다. 이로써 효율적이고 일관된 콜렉션 뷰 구현을 할 수 있습니다.

IGListDiffKit 사용하기

IGListDiffKit을 사용하기 위해서는 몇 가지 단계를 거쳐야 합니다. 먼저 IGListKit 라이브러리를 프로젝트에 추가해야 합니다. IGListKit은 IGListDiffKit을 포함하고 있습니다.

  1. Cocoapods를 통해 IGListKit을 설치합니다.

    pod 'IGListKit'
    
  2. 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
        }
    }
    
  3. 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
        }
    }
    
  4. 콜렉션 뷰 데이터 소스 변경을 감지하는 메서드를 구현합니다. 이 메서드에서 데이터 변경을 처리하고, 콜렉션 뷰 갱신을 위해 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을 적용하면 일관성 있는 콜렉션 뷰 구현 패턴을 유지할 수 있으며, 데이터의 변경에 따른 뷰 업데이트를 쉽게 처리할 수 있습니다.


참고 문서: