Overview

앱에서 CollectionView 를 통해 section, item 등을 표현해야 한다 때로는, 이 CollectionView 에서 section 이나 item 을 삭제하거나 움직여야 할 때도 있다 기존 CollectionView 를 사용하면서는, 데이터가 바뀌고 비교할 때 꽤나 많은 리소스를 들여야 했는데, DiffableDataSource 를 사용하면 리소스가 확연히 많이 줄어든다

기존 CollectionView 는 item 과 section 을 파악할 때, indexPath 를 사용하는데, 이는 데이터가 더해지고 빠지면서 그 값이 변한다 그렇기 때문에 데이터의 변화가 생기면 바뀐 indexPath 를 다시 파악해야 하는 문제가 있다

하지만 DiffableDataSource 는 item 과 section 을 identifier 로 구분하여 저장해 두고 이 identifier 들은 변하지 않는다 그렇기 때문에 CollectionView의 데이터들이 더해지거나 빠지더라도 데이터를 파악하는 방식은 바뀌지 않는다

이 identifier 를 사용하기 위해서는, identifier 의 타입이 Hashable 프로토콜을 따라야 한다 → Set, Dictionary, snapshot 등의 데이터 타입을 사용할 수 있음 → snapshot 들끼리의 구분이 가능 → item, section, snapshot 의 추가, 삭제, 이동 등이 가능

1. Define the Diffable Data Source

먼저, 데이터를 저장하기 위한 diffable data source 를 만들어 둔다

private var recipeDataSource: UICollectionViewDiffableDataSource<RecipeListSection, Recipe.ID>!

RecipeListSection 을 section 을 구분할 수 있는 section identifier 로 사용하는데, 이는 Int 타입을 가지기 때문에 Hashable 프로토콜을 저절로 따르게 된다

private enum RecipeListSection: Int {
		case main
}

필요한 section 에 따라 case 를 추가해준다