Что такое Data Service в архитектуре iOS-приложения?

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

Ответ

Data Service (Сервис данных) — это абстрактный слой в архитектуре приложения, ответственный за централизованное управление операциями с данными. Он инкапсулирует логику работы с различными источниками: сетевыми API, локальными базами данных (Core Data, Realm), кэшем и файловой системой.

Основные задачи Data Service:

  1. Выполнение сетевых запросов и парсинг ответов.
  2. Сохранение и извлечение данных из локального хранилища.
  3. Кэширование данных для оптимизации.
  4. Единообразная обработка ошибок и статусов загрузки.
  5. Преобразование моделей данных (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 на стабы) затрагивает только сервис.
  • Повторное использование: Сервис может использоваться в разных модулях приложения.