[WWDC19] Advances in UI Data Sources

Jungwon Lee·2023년 7월 3일
1

앱을 개발하다 보면 리스트나 그리드의 형태로 데이터를 화면에 표시해야 하는 경우가 대부분이다. iOS 에서는 UIKit의 UITableView나 UICollectionView를 사용하여 구현을 하게 되는데, 그럴 때마다 항상 해왔던 작업은 그런 tableView나 collectionView의 dataSource를 ViewController로 지정하는 일이다.

collectionView.dataSource = self

이는 일종의 delegate 패턴으로, ViewController가 UICollectionViewDataSource 라는 프로토콜을 채택하여 collectionView 에 몇개의 item 을 보여줄 것인지, 또 각각의 cell은 어떤 데이터를 표시할 것인지 등의 정보를 제공하는 것이다.



이러한 방식으로 ViewController는 로컬 데이터베이스나 서버로부터 가져온 모델 데이터를 collectionView에 표시하는 중간 다리 역할을 한다.

그리고 이 모델 데이터가 업데이트 되면, ViewController는 UI를 업데이트 해야한다. 그 때 사용하는 메소드는 대표적으로 reloadData가 있는데, reloadData를 호출하게 되면 collectionView를 다시 그리게 된다.

하지만 변경된 데이터에 따라 collectionView를 최신 상태로 업데이트 하려는 개발자의 노력에도 불구하고, Contorller 계층과 UI 계층의 동기화가 어긋나는 경우가 있다.

WWDC 영상에서는 이를 It's an imperfect world. 라고 언급하였다. 그러면서 기존 reloadData는 애니메이션 없이 UI 업데이트가 진행되어 사용자 경험을 떨어뜨린다고 하였다.

그와 더불어 이러한 에러가 발생하는 근본적인 원인이 centralized된 truth가 없기 때문이라고 말한다.



새로운 방식인 Diffable Data Soruce는 이러한 문제를 Identifier와 Snapshot이라는 개념을 통해 해결하고자 한다.

기존 Data Source의 문제점은 바로 indexPath를 사용한다는 것인데, 이는 section과 item 그 자체가 아니라 그것들의 위치를 나타내는 것이기 때문에 stable 하지 않다는 특징이 있다.

조금만 생각해봐도 삽입과 삭제가 빈번하게 일어나는 상황에서 collectionView를 indexPath를 통해 접근한다면 어긋나게 접근할 수 있을 것 같다.

반면 Identifier는 말 그대로 section과 item의 itentity를 나타내고, indexPath와는 다르게 stable 하다.



Snapshot은 순간을 캡쳐한 장면이라는 뜻처럼 어떠한 시점의 상태를 나타낸다고 보면 되는데, Diffable Data Source에서 이 snapshot이 centralized truth의 역할을 한다.

그리고 apply 메소드를 통해 collectionView를 새로운 데이터, 즉 새로운 snapshot으로 적용함으로써 더 편리하고, 효율적인 업데이트가 이루어진다.

Diffable Data Source의 Diffable이라는 말은 이전 상태와 바뀐 상태의 차이를 알 수 있다는 뜻인데, 이는 shapshot이 Hasable을 준수하는 section indentifier와 item identifier로 이루어져 있기 때문에 hash value를 통해 차이를 인식하고, UI가 업데이트 될 수 있다.

따라서 generic type인 SectionIdentifierType과 ItemIdentifierType이 Hashable을 준수하도록 해야 하며, 이는 곧 모든 섹션과 데이터가 고유해야 함을 의미한다.

하지만 간혹 중복된 데이터를 허용하는 상황이 있을 수도 있다. 이러한 경우에는 ItemIdentifierType을 정의할 때 property로 UUID 라는 고유 값을 포함 시켜 ItemIdentifier 자체의 중복을 피할 수 있다.

Reference
https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/updating_collection_views_using_diffable_data_sources
https://developer.apple.com/videos/play/wwdc2019/220/

profile
안녕하세요

0개의 댓글