기존에 TableView나 CollectionView를 구성할 때 우리는 DataSource와 Delegate를 활용해 구현을 했다.
DataSource는 데이터를 받아 뷰를 그려주는 역할을 한다. 뭘 어떻게 보여줄거냐를 해주는 것이 DataSource라고 생각하면 된다.
Delegate는 어떤 행동에 대한 "동작"을 제시하는 역할을 한다. DataSource가 "보여주는" 역할을 담당했다면 Delegate는 사용자가 보이는 부분 중에 어떤 것을 클릭하거나 어떠한 행동을 했을 때 그 행동에 대한 동작을 수행하는 역할을 한다.
그러던 중 WWDC 19에서 Diffable DataSource가 등장하게 되었다
DiffableDataSource란?
TableView 또는 CollectionView를 그리기 위한 데이터를 관리하고 UI를 업데이트 하는 역할을 한다.
기존 Data Source와 달리 데이터가 달라진 부분을 추적하여 자연스럽게 UI를 업데이트 한다.(기본적인 역할은 동일)
DiffableDataSource 장점
- 추가적인 코드 작업 없이 퀄리티 있는 애니메이션 적용이 가능
- 개선된 Data Source 매커니즘은 완벽하게 동기적인 버그나, 예외, 충돌 상황들을 피할 수 있게 해준다.
- UI 데이터의 동기화 부분 대신 앱의 동적인 데이터와 내용에 집중할 수 있다.
- identifier와 snapshot을 사용하는 간소화 된 Data 모델을 정의하고, 이를 이용하여 UI를 업데이트 한다.
DiffableDataSource와 기존 DataSource와의 차이
기존에 tableView나 collectionView를 사용하기 위해서는 반드시 세가지 메소드를 구현해주어야 했다.
// 1. section의 갯수
func numberOfSections(in collectionView: UICollectionView) -> Int {
...
}
// 2. 각 section의 아이템 갯수
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
...
}
// 3. cell의 render
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
...
}
기존에는 collectionView의 데이터를 구성하기 위해 controller에게 numberOfSection을 물어본다.
controller는 데이터를 채우기 위해 API 통신을 요청하고 응답을 받으면 collectionView에게 변화를 알린다
이러한 상황에서 섹션 수가 잘못되어 앱이 종료되는 경우가 발생하는데, 기존에는 reloadData()를 이용해서 개발자가 직접 데이터의 변경 상황을 관리하고 동기화하여 이를 해결하곤 했다.
그러나 reloadData()로 해결하게 될 경우 UI가 끊겨져 보이지만, DiffableDataSource를 활용할 경우 변경된 데이터 부분의 UI가 자연스럽게 변경되게 된다.
DiffableDataSource에서 변경된 데이터 부분을 알아차리는 방법
DiffableDataSource에서는 Hash value를 사용해서 변경된 부분을 알아차린다.
Diffable Data Source를 사용하기 위해서는 두 가지 generic type을 사용하게 된다.
1. section Identifier
2. Item identifier
이러한 Diffable Data Source는 SectionIdentifierType, ItemIdentifierType 두 개의 generic parameter로 결정된다.
그리고 이 두 파라미터는 반드시 Hashable해야 한다.
DiffableDataSource의 성능
O(N)
모든 아이템의 hash 값을 비교해 보아야 하므로
DiffableDataSource는 background queue에서 작업이 가능하다
data source의 apply 작업이 오래 걸릴 경우 background queue에서 수행하면 된다.
backgroud queue에서 작업이 이뤄지더라도 안전성을 보장할 수 있기 때문이다.
framework는 DiffableDataSource의 작업이 완료되면 메인 큐로 돌아가서 결과를 적용하게 된다.
참고링크:
https://velog.io/@ellyheetov/UI-Diffable-Data-Source
'iOS 개발' 카테고리의 다른 글
[iOS 개발] Fastlane 적용해보기 (0) | 2023.09.05 |
---|---|
[iOS 개발] NotificationCenter란? (0) | 2023.07.26 |
[iOS 개발] Compositional Layout이란? (0) | 2023.05.12 |
BaseViewController란? (0) | 2023.04.27 |
[iOS 개발] 기존 앱을 App Store에서 업데이트 하는 방법 (0) | 2023.03.20 |