Программирование
CoreData с использованием дженериков и шаблона проектирования Одиночка
Вам нужно хранить информацию локально на устройстве? Если ответ положительный, а данные слишком велики для UserDefault, вам, вероятно, придется использовать CoreData.
Вам нужно хранить информацию локально на устройстве? Если ответ положительный, а данные слишком велики для UserDefault, вам, вероятно, придется использовать CoreData.
Как же тогда наиболее эффективно использовать Core Data? Давайте посмотрим, что Xcode предлагает нам делать при создании нового проекта, использующего CoreData.
Если установить этот флажок, будет создан целый проект, готовый к использованию, с примерами использования CoreData с уже реализованными различными полезными функциями.
Самое главное, он сгенерирует файл Data Model и структуру PersistenceController. Давайте более подробно рассмотрим эту структуру.
Как можно заметить, PersistenceController извлекает информацию о контейнере и его контексте, а затем использует @EnvironmentObject для передачи полученного контекста каждому View.
Такой подход не использует все преимущества шаблона проектирования Singleton и делает код беспорядочным.
Лучший способ использовать Core Data
Лучшим подходом было бы использование PersistenceController для обработки различных операций, возможно, с использованием разных расширений структуры для более аккуратного хранения разных файлов.
Изначально PersistenceController будет простым и без каких-либо функций, кроме приватного инициализатора.
Теперь мы можем создать функции, которые реализуют дженерики, а именно «выборку» (fetch) и «удаление» (delete).
Функция «выборка» проста, она принимает в качестве параметра имя сущности и тип, по ним извлекает все значения, хранящиеся в таблице.
Будьте осторожны: при таком использовании дженериков вам всегда нужно объявлять тип вашей переменной, иначе функция не поймет, из какой таблицы вам нужно получить данные.
Функция «удаление» еще проще и требует в качестве параметра элемент, который вы хотите удалить.
Функция saveContext используется для сохранения изменений, сделанных при удалении/добавлении/редактировании объекта.
К сожалению, полностью интегрировать механизм дженериков в создание нового элемента невозможно. Простая функция заключается в следующем:
Теперь вы, вероятно, спрашиваете себя: «Что такое Product и функции copyInEntity?»
Product — это структура, которая инкапсулирует все части информации, полученные из CoreData, и обрабатывает их внутри представления.
Она объявляется так:
Внутри структуры определены две функции, которые помогают обмениваться данными между объектом Swift и объектом CoreData:
- кастомный init принимает в качестве параметра объект CoreData и присваивает все значения Swift;
- copyInEntity делает прямо противоположное, присваивая объекту CoreData все значения Swift.
Эти две функции полезны для очистки кода и более быстрой разработки.
Если вы хотите проверить исходный проект, вот ссылка на GitHub: https://github.com/SidusProxy/CoreDataTutorial