[swift] IGListDiffKit의 사용 예시

IGListDiffKit은 Instagram에서 개발된 iOS용 오픈 소스 라이브러리로, 컬렉션 뷰의 데이터 업데이트를 간편하게 처리할 수 있습니다. IGListDiffKit을 사용하면 컬렉션 뷰의 성능을 최적화하고, 데이터 업데이트 작업을 훨씬 쉽게 처리할 수 있습니다.

IGListDiffKit의 사용 예시를 살펴보겠습니다.

먼저, IGListDiffable 프로토콜을 구현하는 모델 클래스를 작성합니다. 이 프로토콜은 모델 객체의 고유 식별자와 업데이트를 위한 비교 작업을 정의합니다.

import IGListDiffKit

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

다음으로, 컬렉션 뷰 컨트롤러를 작성합니다. IGListAdapter를 사용하여 데이터소스와 뷰 객체의 업데이트를 관리합니다.

import UIKit
import IGListKit

class MyViewController: UIViewController, ListAdapterDataSource {
    
    var items: [MyModel] = []
    var adapter: ListAdapter!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
        adapter.collectionView = collectionView
        adapter.dataSource = self
        
        loadData()
    }
    
    // 더미 데이터 로드
    func loadData() {
        items = [
            MyModel(id: 1, name: "Apple"),
            MyModel(id: 2, name: "Banana"),
            MyModel(id: 3, name: "Orange")
        ]
        
        adapter.performUpdates(animated: true, completion: nil)
    }
    
    // MARK: - ListAdapterDataSource
    
    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return items
    }
    
    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        return MySectionController()
    }
    
    func emptyView(for listAdapter: ListAdapter) -> UIView? {
        return nil
    }
}

마지막으로, 섹션 컨트롤러를 작성합니다. 섹션 컨트롤러는 컬렉션 뷰의 섹션 개수와 셀의 개수, 셀의 표시 방법을 정의합니다.

import UIKit
import IGListKit

class MySectionController: ListSectionController {
    
    var model: MyModel?
    
    override func sizeForItem(at index: Int) -> CGSize {
        guard let width = self.collectionContext?.containerSize.width else { return .zero }
        return CGSize(width: width, height: 50)
    }
    
    override func cellForItem(at index: Int) -> UICollectionViewCell {
        guard let cell = collectionContext?.dequeueReusableCell(of: MyCell.self, for: self, at: index) as? MyCell else {
            fatalError()
        }
        
        cell.titleLabel.text = model?.name
        
        return cell
    }
    
    override func didUpdate(to object: Any) {
        model = object as? MyModel
    }
}

이제 IGListDiffKit을 사용하여 컬렉션 뷰의 데이터 업데이트를 보다 효율적으로 처리할 수 있습니다. IGListKit 문서와 샘플 프로젝트를 참고하여 더 다양한 기능과 사용법을 익혀보세요.

IGListKit 문서

IGListKit 샘플 프로젝트