Ответ
Data Service (Сервис данных) — это абстрактный слой в архитектуре приложения, ответственный за централизованное управление операциями с данными. Он инкапсулирует логику работы с различными источниками: сетевыми API, локальными базами данных (Core Data, Realm), кэшем и файловой системой.
Основные задачи Data Service:
- Выполнение сетевых запросов и парсинг ответов.
- Сохранение и извлечение данных из локального хранилища.
- Кэширование данных для оптимизации.
- Единообразная обработка ошибок и статусов загрузки.
- Преобразование моделей данных (DTO ↔ Domain Model).
Пример реализации с протоколом:
// 1. Протокол для абстракции
protocol ItemsServiceProtocol {
func fetchItems() async throws -> [Item]
func saveItems(_ items: [Item]) throws
}
// 2. Конкретная реализация (Network + Core Data)
class ItemsDataService: ItemsServiceProtocol {
private let networkClient: NetworkClient
private let coreDataStack: CoreDataStack
func fetchItems() async throws -> [Item] {
// Сначала проверяем кэш/БД
let cachedItems = try loadCachedItems()
if !cachedItems.isEmpty { return cachedItems }
// Если нет, делаем сетевой запрос
let dtos = try await networkClient.request(Endpoint.items)
let domainItems = dtos.map { $0.toDomain() }
// Сохраняем результат
try saveItemsToCache(domainItems)
return domainItems
}
private func loadCachedItems() throws -> [Item] { /* ... */ }
private func saveItemsToCache(_ items: [Item]) throws { /* ... */ }
}
Преимущества использования Data Service:
- Разделение ответственности: ViewModel/Controller не знает, откуда берутся данные.
- Тестируемость: Легко подменить мок-сервисом в unit-тестах.
- Гибкость: Изменение источника данных (например, с API на стабы) затрагивает только сервис.
- Повторное использование: Сервис может использоваться в разных модулях приложения.