[swift] IGListDiffKit을 사용한 동적 네스트된 데이터 처리

IGListDiffKit은 iOS 앱에서 사용되는 강력한 데이터 변경 감지 도구입니다. 이를 사용하면 효율적이고 정확한 데이터 업데이트를 처리할 수 있습니다. 이 기능을 사용하여 동적으로 변경되는 네스트된 데이터를 처리하는 방법을 살펴보겠습니다.

IGListDiffKit 개요

IGListDiffKit은 모든 종류의 데이터 모델을 비교하여 변경 내용을 탐지하고 이를 적절한 방식으로 적용합니다. 이는 UICollectionView 또는 UITableView 같은 UI 컴포넌트에서 데이터 변경을 처리하는 데 유용합니다.

동적 네스트된 데이터 처리하는 방법

  1. 데이터 모델 구성하기: 먼저 동적으로 변경되는 네스트된 데이터를 표현할 데이터 모델을 구성해야 합니다. 이 모델은 주로 클래스 또는 구조체로 정의됩니다. 예를 들어, 게시물(Post) 클래스에는 제목, 내용, 작성일 등의 속성이 포함될 수 있습니다. 이 클래스에는 또 다른 클래스인 댓글(Comment) 리스트가 포함될 수도 있습니다.

  2. Diffable 프로토콜 구현하기: IGListDiffKit을 사용하기 위해 데이터 모델은 Diffable 프로토콜을 구현해야 합니다. 이 프로토콜에는 diffIdentifier라는 속성이 포함되어야 합니다. 이 속성은 각 데이터 모델의 유일한 식별자를 반환해야 합니다.

protocol Diffable {
    var diffIdentifier: NSObjectProtocol { get }
}
  1. 셀 데이터 소스 구현하기: 네스트된 데이터를 UI에 표시하기 위해 UITableViewDataSource 또는 UICollectionViewDataSource와 같은 데이터 소스를 구현해야 합니다. 이 데이터 소스는 IGListKit을 사용하여 동적으로 변경되는 데이터를 표시할 수 있도록 설정되어야 합니다.
class MyDataSource: NSObject, ListAdapterDataSource {
    var data: [Post] = [] // 동적 변경되는 데이터 모델
    
    // 데이터 소스 메서드 구현
    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return data
    }
    
    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        return MySectionController() // 데이터 섹션 컨트롤러 생성
    }
    
    // 기타 필요한 메서드 구현
}

class MySectionController: ListSectionController {
    // 섹션 컨트롤러 구현
}
  1. 데이터 업데이트 처리하기: 데이터가 동적으로 변경될 때마다 IGListDiffKit을 사용하여 변경 사항을 탐지하고 업데이트를 수행해야 합니다. 이를 위해 데이터 업데이트 메서드를 구현해야 합니다. 아래의 예시 코드는 데이터 모델에서 댓글 리스트를 업데이트하는 방법을 보여줍니다.
extension MySectionController {
    func updateData(with comments: [Comment]) {
        // 이전에 표시되던 댓글 리스트 가져오기
        guard let currentComments = object?.comments else { return }
        
        // 이전 댓글 리스트와 새로운 댓글 리스트 비교
        let diff = ListDiff(oldArray: currentComments,
                            newArray: comments,
                            option: .equality)
        
        // 갱신 사항 적용하기
        diffResult = diff.result()
    }
}
  1. 데이터 갱신하기: 동적으로 변경되는 데이터를 업데이트하기 위해 적절한 위치에서 데이터를 갱신해야 합니다. 예를 들어, 댓글 리스트의 추가, 삭제, 수정 등의 작업을 수행할 수 있습니다.
func updateComments() {
    // 변경이 발생한 데이터 가져오기
    let updatedComments = fetchUpdatedComments()
    
    // 변경된 데이터 업데이트
    sectionController.updateData(with: updatedComments)
    
    // UI 업데이트
    adapter.performUpdates(animated: true, completion: nil)
}

결론

IGListDiffKit을 사용하면 동적으로 변경되는 네스트된 데이터를 효과적으로 처리할 수 있습니다. 이를테면, 댓글이나 답글 등과 같이 동적으로 변경되는 데이터를 표시해야 하는 앱의 경우, IGListDiffKit은 더욱 효율적인 데이터 업데이트를 가능하게 합니다.

References