Что такое дата слой
Что проверяют
Понимаете ли вы, зачем приложению отдельный слой данных, и умеете ли провести границу между ним и остальным кодом. За вопросом обычно стоит проверка, отличаете ли вы слой данных от обёртки над сетевым клиентом.
Как отвечать
Слой данных отвечает на вопрос, откуда берутся модели, и скрывает ответ от остальных слоёв. Наружу он отдаёт доменные типы и протокол репозитория, внутри держит источники: сеть, локальное хранилище, кэш в памяти.
Из чего он состоит:
- протокол репозитория, объявленный в домене, и его реализация в слое данных;
- источники:
URLSession,Core Dataили SwiftData, файлы, связка ключей для секретов; - отображение объектов передачи данных в доменные модели, чтобы
Codableжил только на границе; - политика обновления: что считается устаревшим, кто сбрасывает кэш, что показываем при ошибке сети.
protocol VacancyRepository {
func list(page: Int) async throws -> [Vacancy]
}Сильный ответ добавляет единый источник истины: интерфейс читает из локального хранилища, а сеть его только обновляет. Тогда офлайн получается сам собой, а не отдельной функциональностью. И отдельно про многопоточность: изменяемое состояние репозитория живёт в акторе или на своей очереди, а отмена приходит через задачу.
Где спотыкаются
Делают слой данных прослойкой над сетью и протаскивают объекты ответа до экрана. Любое переименование поля в контракте доезжает до вьюх, а офлайн становится невозможен, потому что интерфейс умеет показывать только свежий ответ.
Отдают наружу объекты хранилища. Объект Core Data привязан к своему контексту и его очереди, обращение из другого потока портит данные и падает в неожиданном месте, поэтому за границу слоя должны уходить обычные структуры.
Не задают кэшу правил. Без ответа на вопросы, сколько живут данные и кто их сбрасывает, приложение показывает то устаревшее, то пустой экран, а два источника без явного приоритета дают мигание содержимого при каждом запуске.