[swift] IGListDiffKit을 이용한 데이터 검색 기능

IGListDiffKit은 iOS 앱에서 데이터의 변동을 감지하여 효율적으로 UI를 업데이트하는 라이브러리입니다. 이번 블로그 포스트에서는 IGListDiffKit을 사용하여 데이터 검색 기능을 구현하는 방법을 알아보겠습니다.

1. IGListDiffKit 설치하기

먼저, IGListDiffKit을 프로젝트에 설치해야 합니다. Cocoapods를 사용한다면, Podfile에 아래와 같이 IGListDiffKit을 추가합니다.

pod 'IGListDiffKit'

설치가 완료되면 터미널에서 pod install 명령을 실행하여 라이브러리를 프로젝트에 추가합니다.

2. 데이터 검색 기능 추가하기

데이터 검색 기능을 추가하기 위해, 먼저 검색어에 따라 데이터를 필터링하는 메서드를 구현해야 합니다. 이때 IGListDiffKit의 성능을 최대한 활용하기 위해 ListDiffable 프로토콜을 구현하는 모델 클래스를 사용하는 것이 좋습니다.

class User: NSObject, ListDiffable {
    let id: Int
    let name: String

    init(id: Int, name: String) {
        self.id = id
        self.name = name

        super.init()
    }

    // ListDiffable 프로토콜 구현
    func diffIdentifier() -> NSObjectProtocol {
        return id as NSObjectProtocol
    }

    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
        guard let object = object as? User else {
            return false
        }

        return name == object.name
    }
}

위 코드는 User 모델 클래스의 예시입니다. User 클래스는 ListDiffable 프로토콜을 구현하여 데이터의 고유 식별자인 id와 이름인 name을 기준으로 동등성을 비교합니다.

다음으로, 검색어에 따라 데이터를 필터링하는 메서드를 구현합니다.

class UserDataSource: NSObject, ListAdapterDataSource {
    var users: [User] = []

    // 검색어에 따라 데이터 필터링
    func filteredUsers(with searchText: String) -> [User] {
        guard !searchText.isEmpty else {
            return users
        }

        return users.filter { $0.name.contains(searchText) }
    }

    // ListAdapterDataSource 프로토콜 구현
    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return filteredUsers()
    }

    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        // 섹션 컨트롤러 구현
        return UserSectionController()
    }

    // ...
}

위 코드는 UserDataSource 클래스의 예시입니다. filteredUsers(with:) 메서드를 통해 검색어에 따라 필터링된 사용자 데이터를 반환합니다.

3. 검색 기능 사용하기

이제 IGListDiffKit을 사용하여 데이터 검색 기능을 구현한 UserDataSource 클래스를 사용할 수 있습니다. 이를 위해 IGListKit의 ListAdapter를 초기화하고 검색어를 업데이트해야 합니다.

class ViewController: UIViewController {
    @IBOutlet weak var collectionView: UICollectionView!

    let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
    let userDataSource = UserDataSource()

    override func viewDidLoad() {
        super.viewDidLoad()

        adapter.collectionView = collectionView
        adapter.dataSource = userDataSource
    }

    // 검색어 업데이트 시 호출되는 메서드
    func updateSearchResults(for searchText: String) {
        userDataSource.updateSearchText(searchText)
        adapter.performUpdates(animated: true, completion: nil)
    }

    // ...
}

위 코드는 ViewController 클래스의 예시입니다. updateSearchResults(for:) 메서드에서 검색어를 업데이트하고, IGListDiffKit을 사용하여 UI를 업데이트하는 것을 확인할 수 있습니다.

결론

IGListDiffKit을 사용하여 데이터 검색 기능을 구현하는 방법을 알아보았습니다. IGListDiffKit을 활용하면 데이터의 변동을 효율적으로 추적하여 UI를 업데이트할 수 있으므로, 데이터 검색 기능을 포함한 다양한 앱 개발 시 활용할 수 있습니다.

참고: IGListDiffKit GitHub