[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 문서와 샘플 프로젝트를 참고하여 더 다양한 기능과 사용법을 익혀보세요.