iOS

[iOS] Diffable DataSource, SnapShot, Compositional Layout

yevdev 2022. 6. 4. 11:58

1️⃣ UICollectionView의 Data, Presentation 이슈

- 기존 UICollectionView의 구현방법을 살펴보면, Controller가 데이터를 받아와서 UI에게 변경을 알린다.

- 여기서, Controller와 UI가 가지고 있는 데이터가 서로 다른 이슈가 생길 수 있다. → 앱에서는 어느 데이터가 맞는건지 확인하기 어려움

 

 

Single Source Of Truth Data의 필요성 증가

- 이 이슈의 근본적인 문제 해결 방식은 참인 데이터를 하나만 두도록 하는 것이다.  Single Source Of Truth

- 그래서 제안된 방법 Diffable DataSource

 

 

Diffable DataSource ?

Diffable DataSource는 Data Source와 달리, 데이터가 달라진 부분을 추적하여 자연스럽게 UI를 업데이트 한다.

이전과 달라진 부분은 자동으로 알아차리고, 새로운 부분만 다시 그려져 단순 업데이트가 가능하다.

 

 

Diffable DataSource의 장점

- 충돌, 예외처리 상황을 피할 수 있고

- 동기적인 부분보다는 앱의 동적인 데이터와 내용에 집중할 수 있다.

- identifier와 snapshot을 사용하는 간소화 된 Data 모델을 정의하고, 이를 이용하여 UI를 업데이트한다.

 

 

SnapShot?

- 한가지 참인 데이터를 관리하는 객체

- indexPath를 쓰지 않고, 섹션 및 아이템에 대해서 Unique ID를 사용한다. → Unique + Hashable

 

 

아이템 구현의 예

struct MyModel: Hashable {
	let identifier = UUID()
    func hash(into hasher: inout Hasher) {
    	hasher.combine(identifier)
    }
    static func == (lhs: MyModel, rhs: MyModel) -> Bool {
    	return lhs.identifier == rhs.identifier
    }
}

 

 

 

 

2️⃣ UICollectionView의 Layout 이슈

- 기존의 UICollectionViewFlowLayout 은 대부분의 단순 디자인에서는 좋은 역할

- 그치만, 점점 더 복잡한 디자인에서는 CustomLayout을 그때마다 구현해주어야하는 문제점이 있음

 

 

Layout 이슈의 해결로 Compositional Layout이 등장

Compositional Layout

let size = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension .absolute(44.0))
let item = NSCollectionLayoutItem(layoutSize: size)
let group = NSCollectionLayoutGroup.horizontal(layoutSize: size, subitems: [item])
let section = NSCollectionLayoutSection(group: group)
let layout = UICollectionViewCompositionalLayout(section: section)

 

 


📌 정리,

1️⃣ 기존 UICollectionView의 Data, Presentation 이슈

UICollectionViewDataSourceUICollectionViewDiffableDataSource

 

- Presentation : DiffableDataSource

- Data : SnapShot

 

2️⃣ 기존 UICollectionView의 Layout 이슈

UICollectionViewFlowLayout  UICollectionViewCompositionalLayout

 

 


Reference

'iOS' 카테고리의 다른 글

[iOS] Combine (1) : Overview  (0) 2022.07.03
[iOS] Navigation과 Modal  (0) 2022.06.29
[iOS] UICollectionView와 UIScrollView 사이의 관계  (0) 2022.05.30
[iOS] UITabbarController 개요  (0) 2022.05.29
[iOS] UICollectionView 개요  (0) 2022.05.19