[swift] IGListDiffKit과 함께하는 즐겨찾기 처리

IGListDiffKit은 iOS 앱에서 데이터의 변경 사항을 효율적으로 처리하는 라이브러리입니다. 이번 블로그 포스트에서는 IGListDiffKit을 사용하여 즐겨찾기 기능을 구현하는 방법에 대해 알아보겠습니다.

즐겨찾기 모델 설계

먼저, 즐겨찾기를 구현하기 위한 모델을 설계해야 합니다. 즐겨찾기에는 각 아이템의 고유 식별자(ID)와 즐겨찾기 상태(즐겨찾기된 아이템인지 여부)가 포함될 수 있습니다. 예를 들어, 다음과 같은 모델을 사용할 수 있습니다:

struct Bookmark {
    let id: Int
    let isBookmark: Bool
}

즐겨찾기 목록 관리

다음으로, 즐겨찾기 목록을 관리하는 클래스를 작성해야 합니다. 이 클래스는 IGListDiffable 프로토콜을 준수해야 하며, IGListDiffKit의 리스트 관리 기능을 활용할 수 있습니다. 예를 들어, 다음과 같이 클래스를 작성할 수 있습니다:

class BookmarkManager: NSObject, ListDiffable {
    var bookmarks: [Bookmark]
    
    init(bookmarks: [Bookmark]) {
        self.bookmarks = bookmarks
    }
    
    // MARK: - ListDiffable
    
    func diffIdentifier() -> NSObjectProtocol {
        return "bookmarks" as NSObjectProtocol
    }
    
    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
        return true
    }
}

IGListDiffableDataSource 구현

이제, IGListDiffableDataSource를 구현하여 즐겨찾기 목록을 화면에 표시할 수 있습니다. IGListDiffableDataSource는 IGListKit의 데이터 소스 인터페이스를 제공합니다. 예를 들어, 다음과 같이 클래스를 작성할 수 있습니다:

class BookmarkViewController: UIViewController, ListAdapterDataSource {
    private var bookmarkManager: BookmarkManager!
    private var collectionView: UICollectionView!
    private var adapter: ListAdapter!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 즐겨찾기 목록 초기화
        bookmarkManager = BookmarkManager(bookmarks: [
            Bookmark(id: 1, isBookmark: true),
            Bookmark(id: 2, isBookmark: false),
            Bookmark(id: 3, isBookmark: true)
        ])
        
        // 컬렉션 뷰 초기화
        collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: UICollectionViewFlowLayout())
        collectionView.backgroundColor = .white
        view.addSubview(collectionView)
        
        // 어댑터 초기화
        adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
        adapter.collectionView = collectionView
        adapter.dataSource = self
    }
    
    // MARK: - ListAdapterDataSource
    
    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return [bookmarkManager]
    }
    
    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        return BookmarkSectionController()
    }
    
    func emptyView(for listAdapter: ListAdapter) -> UIView? {
        return nil
    }
}

BookmarkSectionController 구현

마지막으로, 각 즐겨찾기 아이템을 표시하는 섹션 컨트롤러를 구현해야 합니다. 섹션 컨트롤러는 IGListSectionController를 상속하고, IGListDiffable을 준수해야 합니다. 예를 들어, 다음과 같이 클래스를 작성할 수 있습니다:

class BookmarkSectionController: ListSectionController {
    private var bookmark: Bookmark!
    
    override func didUpdate(to object: Any) {
        guard let bookmarkManager = object as? BookmarkManager else {
            return
        }
        
        bookmark = bookmarkManager.bookmarks[0]
    }
    
    override func numberOfItems() -> Int {
        return 1
    }
    
    override func cellForItem(at index: Int) -> UICollectionViewCell {
        // 셀 생성 및 구성
        let cell = collectionContext?.dequeueReusableCell(withNibName: "BookmarkCell",
                                                        bundle: nil,
                                                        for: self,
                                                        at: index) as! BookmarkCell
        cell.configure(with: bookmark)
        return cell
    }
    
    override func sizeForItem(at index: Int) -> CGSize {
        // 셀 크기 반환
        return CGSize(width: collectionContext?.containerSize.width ?? 0, height: 60)
    }
    
    override func didSelectItem(at index: Int) {
        // 즐겨찾기 상태 변경
        bookmark.isBookmark = !bookmark.isBookmark
        collectionContext?.reload(self)
    }
    
    // MARK: - IGListDiffable
    
    override func diffIdentifier() -> NSObjectProtocol {
        return bookmark as NSObjectProtocol
    }
    
    override func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
        return true
    }
}

위 코드에서 BookmarkCell은 즐겨찾기 아이템을 표시하는 커스텀 셀이며, 이에 대한 구현은 생략되었습니다.

이제 IGListDiffKit을 사용하여 즐겨찾기 기능을 손쉽게 구현할 수 있습니다. IGListDiffKit을 활용하면 데이터의 변경 사항을 효율적으로 처리할 수 있으며, 화면 갱신에 필요한 작업을 최소화할 수 있습니다.

참고 자료