Что такое Diffable Data Source в UIKit?

«Что такое Diffable Data Source в UIKit?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Diffable Data Source — это современный API (представлен в iOS 13) для управления данными в UITableView и UICollectionView. Он автоматически вычисляет разницу (diff) между двумя состояниями данных и применяет анимированные обновления к интерфейсу, избавляя от ручных вызовов reloadData() и performBatchUpdates().

Основные компоненты:

  1. NSDiffableDataSourceSnapshot — «снимок» текущего состояния данных (секции и элементы).
  2. 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.