앱에서 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 의 추가, 삭제, 이동 등이 가능
먼저, 데이터를 저장하기 위한 diffable data source 를 만들어 둔다
private var recipeDataSource: UICollectionViewDiffableDataSource<RecipeListSection, Recipe.ID>!
RecipeListSection 을 section 을 구분할 수 있는 section identifier 로 사용하는데,
이는 Int 타입을 가지기 때문에 Hashable 프로토콜을 저절로 따르게 된다
private enum RecipeListSection: Int {
case main
}
필요한 section 에 따라 case 를 추가해준다