Ответ
Diffable Data Source — это современный API (представлен в iOS 13) для управления данными в UITableView и UICollectionView. Он автоматически вычисляет разницу (diff) между двумя состояниями данных и применяет анимированные обновления к интерфейсу, избавляя от ручных вызовов reloadData() и performBatchUpdates().
Основные компоненты:
NSDiffableDataSourceSnapshot— «снимок» текущего состояния данных (секции и элементы).UICollectionViewDiffableDataSource/UITableViewDiffableDataSource— объект, связывающий снапшот с представлением.
Ключевые преимущества:
- Автоматическая анимация — добавление, удаление и перемещение ячеек анимируется без дополнительного кода.
- Безопасность — устраняет типичные ошибки рассогласования данных и индексов.
- Декларативность — вы описываете, какие данные должны быть, а система определяет, как к этому прийти.
Пример настройки для UICollectionView:
// 1. Определяем типы, соответствующие Hashable.
enum Section { case main }
struct Item: Hashable { let id: UUID; let title: String }
// 2. Создаем источник данных.
var dataSource: UICollectionViewDiffableDataSource<Section, Item>!
dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) {
(collectionView, indexPath, item) -> UICollectionViewCell? in
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! MyCell
cell.configure(with: item)
return cell
}
// 3. Формируем и применяем снапшот.
var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
snapshot.appendSections([.main])
snapshot.appendItems(itemsArray) // itemsArray — массив [Item]
dataSource.apply(snapshot, animatingDifferences: true)
Важно: И секции, и элементы должны быть уникально идентифицируемыми и соответствовать протоколу Hashable.