В чем разница между Data Source и Data Service?

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

Ответ

Data Source и Data Service — это разные паттерны с различными целями в iOS-разработке. Их часто путают из-за схожих названий.

Аспект Data Source Data Service
Назначение Поставщик данных для UI-компонентов (таблицы, коллекции). Отвечает на вопросы "сколько?" и "что показывать?". Абстрактный слой для операций с данными. Отвечает за получение, сохранение и преобразование данных из/в различные источники.
Контекст UIKit / SwiftUI (протоколы UITableViewDataSource, UICollectionViewDataSource). Архитектура приложения (слой доменной логики или инфраструктуры).
Ответственность 1. Количество секций и ячеек.
2. Конфигурация view для конкретного IndexPath.
3. Управление заголовками.
1. Сетевые запросы.
2. Работа с БД (Core Data).
3. Кэширование.
4. Преобразование моделей.
5. Обработка ошибок.
Типичная реализация Класс, соответствующий протоколу UIKit, или DiffableDataSource. Класс или структура, часто скрытая за протоколом (например, ItemsRepository).

Взаимодействие в архитектуре:

// Data Service получает "сырые" данные
class ProductService {
    func loadProducts() async -> [Product] { /* сеть/БД */ }
}

// ViewModel преобразует данные и хранит состояние
class ProductListViewModel {
    @Published var products: [ProductViewModel] = []
    private let service: ProductService
    func load() { /* вызывает service, маппит в ProductViewModel */ }
}

// Data Source использует подготовленные данные для UI
class ProductDataSource: UITableViewDiffableDataSource<Section, ProductViewModel> {
    // Настраивает ячейки на основе ProductViewModel
}
// ViewController связывает ViewModel и DataSource

Ключевой вывод: Data Source — это мост между данными и конкретным UI-виджетом. Data Service — это мост между приложением и внешними источниками данных (сеть, БД).