[swift] Swift DeepDiff를 사용하여 컬렉션 데이터 변경 시 셀 애니메이션 제거하기

많은 iOS 앱에서 UITableViewDataSource와 UICollectionViewDataSource를 사용하여 컬렉션 뷰와 테이블 뷰의 데이터를 관리합니다. 데이터가 변경될 때마다 셀 애니메이션을 적용하면 사용자 경험을 향상시킬 수 있습니다. 그러나 때로는 데이터 변경 시 셀 애니메이션을 제거하는 것이 필요할 수도 있습니다. 이럴 때 Swift DeepDiff 라이브러리를 사용하면 컬렉션 데이터 변경 시 셀 애니메이션을 손쉽게 제거할 수 있습니다.

DeepDiff란?

DeepDiff는 Swift로 작성된 라이브러리로, 컬렉션 데이터의 변경 내용을 식별하고 애니메이션이나 다른 작업을 수행하는 데 사용됩니다. 이 라이브러리는 두 배열의 차이점을 비교하여 추가, 제거 또는 수정된 항목을 식별할 수 있습니다. 따라서 컬렉션 데이터 변경 시에만 셀 애니메이션을 적용할 수 있습니다.

DeepDiff 라이브러리를 사용하기 위해 다음과 같이 패키지를 추가합니다.

dependencies: [
    .package(url: "https://github.com/onmyway133/DeepDiff.git", from: "5.0.0")
]

DeepDiff를 사용하여 컬렉션 데이터 변경 내역 식별하기

DeepDiff를 사용하려면 비교할 이전 배열과 현재 배열을 가지고 있어야 합니다.

let oldData = ["A", "B", "C"]
let newData = ["A", "C", "D", "E"]

DeepDiff를 사용하여 변경 내역을 식별하여 이를 활용할 수 있습니다.

let changeset = DeepDiff.diff(old: oldData, new: newData)

변경 내역은 다음과 같은 형식으로 반환됩니다.

ChangeWithIndexPath.inserts([2, 3])
ChangeWithIndexPath.deletes([1])

변경 내역에 따라 애니메이션 적용 또는 제거 작업을 수행하면 됩니다.

컬렉션 뷰에서 DeepDiff 사용하기

UICollectionView에서 DeepDiff를 사용하려면 먼저 변경된 항목을 식별하고 애니메이션 적용 또는 제거 작업을 수행해야 합니다.

let changeset = DeepDiff.diff(old: oldData, new: newData)

collectionView.reload(changeset: changeset, updateData: {
    self.data = newData
})

위의 코드에서 reload(changeset:updateData:) 메서드는 변경 내역에 따라 셀의 애니메이션을 적용하고 데이터를 업데이트합니다.

테이블 뷰에서 DeepDiff 사용하기

UITableView에서도 마찬가지로 변경 내역을 식별하고 애니메이션 적용 또는 제거 작업을 수행할 수 있습니다.

let changeset = DeepDiff.diff(old: oldData, new: newData)

tableView.reload(changeset: changeset, updateData: {
    self.data = newData
})

위의 코드에서 reload(changeset:updateData:) 메서드를 사용하여 변경 내역에 따라 셀의 애니메이션을 적용하고 데이터를 업데이트합니다.

결론

Swift DeepDiff를 사용하면 컬렉션 데이터 변경 시 셀 애니메이션을 제거하는 작업을 간단하게 수행할 수 있습니다. 데이터의 변경 내역을 식별하고 이를 기반으로 애니메이션 적용 또는 제거 작업을 수행하면 사용자 경험을 보다 향상시킬 수 있습니다.

참고 자료